여정 On-Ramp(수신 램프) 샘플의 작동 방법
샘플 여정 테스트 클라이언트 애플리케이션은 클라이언트 애플리케이션 창의 컨트롤을 사용하여 만든 여정이 포함된 SOAP 헤더 집합을 빌드하고, 디스크에서 지정된 메시지 파일을 로드하고, 메시지에 여정 헤더를 추가하고, 처리를 위해 여정 온-램프를 통해 ESB에 제출합니다. 여정이 응답을 생성하는 경우 애플리케이션은 응답을 수집하고 애플리케이션 창에 표시합니다.
여러 샘플 여정 구성 파일 중에서 선택하여 오케스트레이션, 메시징 또는 둘 다의 조합을 사용하는 단방향 및 양방향 시나리오를 볼 수 있습니다.
여정 서비스에서 메시지의 여정 정보를 사용하는 방법을 이해하는 데 도움이 되도록 다음 XML은 이전 예제에서 사용된 TwoWay-OrchTransform-OrchRoutingGroup-OrchTwoWayCustom.xml 라는 샘플 여정 구성 파일을 보여줍니다. 이 여정의 첫 번째 섹션에서는 세 가지 서비스 호출 단계를 지정합니다.
<Itinerary xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" uuid="" beginTime="" completeTime="" state="Pending" isRequestResponse="false" servicecount="0" xmlns="http://schemas.microsoft.biztalk.practices.esb.com/itinerary">
<BizTalkSegment interchangeId="" epmRRCorrelationToken="" receiveInstanceId="" messageId="" xmlns="" />
<ServiceInstance name="Microsoft.Practices.ESB.Services.Transform" type="Orchestration" state="Pending" position="0" isRequestResponse="false" xmlns="" />
<Services xmlns="">
<Service uuid="92d3b293-e6d4-44a1-b27d-c42b48aec667" beginTime="" completeTime="" name="Microsoft.Practices.ESB.Services.Transform" type="Orchestration" state="Pending" isRequestResponse="false" position="0" serviceInstanceId="" />
</Services>
<Services xmlns="">
<Service uuid="774488bc-e5b9-4a4e-9ae7-d25cdf23fd1c" beginTime="" completeTime="" name="Microsoft.Practices.ESB.Services.Routing" type="Orchestration" state="Pending" isRequestResponse="false" position="1" serviceInstanceId="" />
</Services>
<Services xmlns="">
<Service uuid="" beginTime="" completeTime="" name="ProcessAndRespond" type="Orchestration" state="Pending" isRequestResponse="true" position="2" serviceInstanceId="" />
</Services>
...
여정의 서비스 호출 단계 목록에는 여정 서비스가 여정에 정의된 각 서비스에 대한 확인 정보를 찾거나 제공할 수 있는 확인자(연결 문자열로 표시됨)의 세부 정보가 포함된 섹션이 있습니다.
...
<ResolverGroups xmlns="">
<Resolvers serviceId="Microsoft.Practices.ESB.Services.Transform0"><![CDATA[BRE:\\Policy=ResolveMap;Version=1.0;UseMsg=False;]]></Resolvers>
<Resolvers serviceId="Microsoft.Practices.ESB.Services.Routing1"><![CDATA[STATIC:\\TransportType=FILE;TransportLocation=C:\Projects\Microsoft.Practices.ESB\Source\Samples\DynamicResolution\Test\Filedrop\OUt\%MessageID%.xml;Action=;EndpointConfig=;JaxRpcResponse=False;MessageExchangePattern=;TargetNamespace=;TransformType=;]]><![CDATA[UDDI3:\\ServerUrl=http://localhost/uddi;SearchQualifiers=andAllKeys;CategorySearch=;BindingKey=uddi:esb:orderfileservicev3.1;]]></Resolvers>
<Resolvers serviceId="ProcessAndRespond2" />
</ResolverGroups>
</Itinerary>
참고
각 <Resolvers> 요소의 실제 콘텐츠에는 이전 목록의 줄을 래핑하는 데 사용되는 공백 문자가 포함되어 있지 않습니다.
다음은 이전 구성의 여정에 정의된 세 가지 단계입니다.
Microsoft.Practices.ESB.Services.Transform 오케스트레이션을 실행하여 BIzTalk BRE(비즈니스 규칙 엔진)를 사용하여 ResolverMap 정책으로 메시지를 변환합니다.
Microsoft.Practices.ESB.Services.Routing1 라우팅을 사용하여 변환된 메시지를 여러 위치로 라우팅하려면 Microsoft.Practices.ESB.Services.Routing 오케스트레이션을 실행합니다. <ResolverGroups> 섹션에는 연결 문자열을 <정의하는 이 식별자가 있는 Resolvers> 요소가 포함되어 있습니다.
이 샘플과 함께 제공되는 ProcessAndRespond 오케스트레이션을 실행합니다. 이 오케스트레이션의 구현은 응답으로 요청 메시지의 복사본을 여정 테스트 클라이언트로 다시 보냅니다.
각 서비스가 완료되면 서비스는 여정을 진행하며 여정에 정의된 다음 서비스를 현재 서비스 instance 승격하고 상태는 보류 중으로 설정됩니다.
참고
여정 온-램프 샘플은 동적 해상도를 사용하여 메시지를 출력 폴더로 보냅니다. 이 때문에 이 샘플에 대해 정적 송신 포트가 정의되어 있지 않습니다.
다음은 테스트 클라이언트 애플리케이션이 메시지를 제출한 후에 발생하는 이벤트 시퀀스입니다.
OnRamp.Itinerary 수신 포트는 메시지를 받습니다.
ItineraryReceiveXml 파이프라인은 SOAP 헤더에서 여정을 추출하고, 유효성을 검사하고, 미리 처리하고, 여정을 메시지 컨텍스트 속성으로 인바운드 메시지에 쓰고, 메시지를 BizTalk Message Box 데이터베이스에 게시합니다.
Microsoft.Practices.ESB.Services.Transform 서비스 오케스트레이션에 대한 구독은 이 오케스트레이션의 호출을 트리거합니다. 오케스트레이션은 먼저 다음 코드와 같이 현재 메시지를 매개 변수로 전달하여 현재 여정 단계를 검색합니다.
itineraryStep = itinerary.Itinerary.GetItineraryStep(InboundMessage);
ItineraryStep 개체에는 실행을 위해 현재 서비스 instance 대한 모든 정보와 연결된 모든 확인자가 포함됩니다.
Resolver 개체는 다음 코드와 같이 ItineraryStep instance 검색되고 ESB Resolver Framework는 변환 맵의 전체 이름을 resolve 데 사용됩니다.
resolverDictionary = Microsoft.Practices.ESB.Resolver.ResolverMgr.Resolve(InboundMessage, resolver); // Set the transform type. transformType = resolverDictionary.Item("Resolver.TransformType");
Microsoft BizTalk ESB Toolkit Resolver 및 Adapter Framework는 ResolverMap 정책을 호출하고 ResolverDictionary 개체를 채우는 캐시(이 예제에서는 BizTalk 비즈니스 규칙 엔진 확인자)에서 적절한 확인자를 로드하여 이를 수행합니다.
오케스트레이션이 완료되면 코드는 다음 코드와 같이 AdvanceItinerary 메서드를 호출합니다.
// Call the Itinerary helper to advance to the next step. itinerary.Itinerary.Advance(OutboundMessage, itineraryStep.ItineraryStep);
이렇게 하면 해당 속성을 업데이트하고 여정에 정의된 다음 서비스를 다음에 실행할 서비스로 승격하여 현재 여정을 진행합니다. 메서드는 서비스가 직접 바인딩된 송신 포트를 통해 Message Box 데이터베이스에 다시 게시하는 아웃바운드 메시지에 여정을 복사합니다.
Microsoft.Practices.ESB.Services.Delivery 서비스 오케스트레이션에 대한 구독은 이 오케스트레이션의 호출을 트리거합니다. 이 오케스트레이션은 첫 번째 오케스트레이션과 유사한 프로세스를 수행하여 현재 여정 단계를 가져옵니다. 그러나 이 오케스트레이션은 ItineraryStep instance 반환된 확인자 컬렉션을 반복합니다. 컬렉션의 각 확인자에서 배달 오케스트레이션은 Microsoft BizTalk ESB Toolkit Resolver 및 Adapter Framework를 사용하여 전송 위치를 resolve 다음 코드와 같이 나가는 메시지 내에서 컨텍스트 속성으로 승격합니다.
// Move to retrieve the first resolver. resolver = resolvers.Current; // Pass the resolver configuration to the Resolver Manager // for resolution. resolverDictionary = Microsoft.Practices.ESB.Resolver.ResolverMgr.Resolve(InboundMessage, resolver); // Set the transport properties. transportLocation = resolverDictionary.Item("Resolver.TransportLocation"); transportType = resolverDictionary.Item("Resolver.TransportType"); // Call the Adapter Manager to set all necessary properties. Microsoft.Practices.ESB.Adapter.AdapterMgr.SetEndpoint( resolverDictionary, DeliveryMessage); // Set the delivery port address and type. DeliveryPort(Microsoft.XLANGs.BaseTypes.Address) = transportLocation; DeliveryPort(Microsoft.XLANGs.BaseTypes.TransportType) = transportType;
ProcessAndRespond 오케스트레이션에 대한 구독은 필터 식 속성에 대해 정의된 메시지 컨텍스트 속성의 일치로 인해 이 오케스트레이션의 호출을 트리거합니다.
(Microsoft.Practices.ESB.Itinerary.Schemas.ServiceName == :"ProcessAndRespond") && Microsoft.Practices.ESB.Itinerary.Schemas.ServiceState == "Pending") && (Microsoft.Practices.ESB.Itinerary.Schemas.ServiceType == "Orchestration")
ProcessAndRespond 오케스트레이션은 여정을 진행하고 원래 요청 메시지를 응답으로 여정 테스트 클라이언트 애플리케이션에 온-램프 서비스로 다시 보냅니다.