スケジュール オンランプ サンプルのしくみ
サンプルの Itinerary Test Client アプリケーションは、クライアント アプリケーション ウィンドウでコントロールを使用して作成したスケジュールを含む SOAP ヘッダーのセットを構築し、指定されたメッセージ ファイルをディスクから読み込み、スケジュール ヘッダーをメッセージに追加して、処理のためにスケジュール オンランプを通じて ESB に送信します。 スケジュールによって応答が生成された場合、アプリケーションは応答を収集し、アプリケーション ウィンドウに表示します。
複数のサンプル スケジュール構成ファイルから選択して、オーケストレーション、メッセージング、またはその両方の組み合わせを使用する一方向と双方向のシナリオを確認できます。
スケジュール サービスがメッセージ内の旅程情報をどのように使用するかを理解するために、次の XML は、前の例で使用した TwoWay-OrchTransform-OrchRoutingGroup-OrchTwoWayCustom.xml という名前のサンプル スケジュール構成ファイルを示しています。 このスケジュールの最初のセクションでは、3 つのサービス呼び出し手順を指定します。
<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>
Note
各 <Resolvers> 要素の実際の内容には、前の一覧の行を折り返すために使用される空白文字は含まれていません。
前の構成の旅程で定義されている 3 つの手順を次に示します。
Microsoft.Practices.ESB.Services.Transform オーケストレーションを実行して、BizTalk ビジネス ルール エンジン (BRE) を使用して ResolverMap ポリシーでメッセージを変換します。
Microsoft.Practices.ESB.Services.Routing1 のルーティングを使用して、Microsoft.Practices.ESB.Services.Routing オーケストレーションを実行して、変換されたメッセージを複数の場所にルーティングします。 ResolverGroups<> セクションには、接続文字列を<定義するこの識別子を持つ Resolvers> 要素が含まれています。
このサンプルで提供されている ProcessAndRespond オーケストレーションを実行します。 このオーケストレーションの実装では、要求メッセージのコピーが応答としてスケジュール テスト クライアントに送信されます。
各サービスが完了すると、サービスは旅程を進め、スケジュールに定義されている次のサービスを現在のサービス インスタンスに昇格し、その状態を [保留中] に設定します。
Note
Itinerary On-Ramp サンプルでは、動的解像度を使用して出力フォルダーにメッセージを送信します。 このため、このサンプルには静的送信ポートが定義されていません。
テスト クライアント アプリケーションがメッセージを送信した後に発生するイベントのシーケンスを次に示します。
OnRamp.Itinerary 受信ポートはメッセージを受信します。
ItineraryReceiveXml パイプラインは、SOAP ヘッダーからスケジュールを抽出し、それを検証して前処理し、受信メッセージにメッセージ コンテキスト プロパティとしてスケジュールを書き込み、メッセージを BizTalk Message Box データベースに発行します。
Microsoft.Practices.ESB.Services.Transform サービス オーケストレーションのサブスクリプションによって、このオーケストレーションの呼び出しがトリガーされます。 オーケストレーションは、次のコードに示すように、現在のメッセージをパラメーターとして渡すことによって、最初に現在のスケジュール ステップを取得します。
itineraryStep = itinerary.Itinerary.GetItineraryStep(InboundMessage);
ItineraryStep オブジェクトには、実行中の現在のサービス インスタンスに関するすべての情報と、それに関連付けられているリゾルバーが含まれます。
リゾルバー オブジェクトは ItineraryStep インスタンスから取得され、次のコードに示すように、ESB リゾルバー フレームワークを使用して変換マップの完全な名前を解決します。
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 は、キャッシュ (この例では BizTalk ビジネス ルール エンジン リゾルバー) から適切なリゾルバーを読み込むことでこれを実現します。このリゾルバー は ResolverMap ポリシーを呼び出し、 ResolverDictionary オブジェクトを設定します。
オーケストレーションが完了すると、次のコードに示すように、 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 インスタンスによって返されるリゾルバーのコレクションを反復処理します。 コレクション内のリゾルバーごとに、配信オーケストレーションは Microsoft BizTalk ESB Toolkit Resolver と Adapter Framework を使用してトランスポートの場所を解決し、次のコードに示すように、送信メッセージ内のコンテキスト プロパティとして昇格します。
// 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 オーケストレーションは旅程を進め、元の要求メッセージを応答としてスケジュール テスト クライアント アプリケーションにオンランプ サービスに返送します。