スキャッター/ギャザー サンプルのしくみ
サンプル アプリケーションは、Scatter-Gather のスケジュール ファイルから読み込まれたスケジュールを含む一連の SOAP ヘッダーをビルドし、指定されたメッセージ ファイルをディスクから読み込み、メッセージにスケジュール ヘッダーを追加して、処理用のオンランプを介して ESB に送信します。 スケジュールによって応答が生成された場合、アプリケーションはこれを収集し、アプリケーション ウィンドウに表示します。
スケジュール サービスがメッセージ内の旅程情報をどのように使用するかを理解するために、次の一覧に、ScatterGatherItinerary.xml という名前のサンプル スケジュール構成ファイルを示します。 このスケジュールの最初のセクションでは、2 つのサービス呼び出し手順を指定します。
<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"
xmlns="http://schemas.microsoft.biztalk.practices.esb.com/itinerary">
<ServiceInstance uuid="" name="ScatterGather" type="Orchestration"
state="Pending" position="0"
isRequestResponse="false" xmlns="" />
<Services xmlns="">
<Service uuid="" beginTime="" completeTime="" name="ScatterGather"
type="Orchestration" state="Pending" isRequestResponse="false"
position="0" serviceInstanceId="" />
</Services>
<Services xmlns="">
<Service uuid="" beginTime="" completeTime="" name="DynamicTest"
type="Messaging" state="Pending" isRequestResponse="false"
position="1" serviceInstanceId="" />
</Services>
</Itinerary>
...
スケジュールのサービス呼び出し手順の一覧の後には、リゾルバーと接続文字列の詳細が含まれているセクションがあります。このセクションでは、次の XML に示すように、Itinerary サービスが旅程で定義されている各サービスを検索できます。
<ResolverGroups xmlns="">
<Resolvers serviceId="ScatterGather0"><![CDATA[BRE:\\policy=ResolveEndPointScatterGather;version=;useMsg=;]]><![CDATA[UDDI3:\\serverUrl=http://localhost/uddi;bindingKey=uddi:esb:purchaseordersubmitorderservicebinding;credentialType=Ntlm]]></Resolvers>
<Resolvers serviceId="DynamicTest1"><![CDATA[UDDI3:\\serverUrl=http://localhost/uddi;bindingKey=uddi:esb:orderfileservicebinding;credentialType=Ntlm]]>
</Resolvers>
</ResolverGroups>
この例では、両方の競合回避モジュール接続文字列がこのサービスの場所に解決されるため、アプリケーションは SubmitPOService Web サービスを 2 回実行します (http://localhost/ESB.CanadianServices/SubmitPOService.asmx). メッセージ コンテキストでは、ブローカー オーケストレーションをアクティブ化する最初のスケジュール サービスとして指定します。サンプルでは次のように定義されています。
(Microsoft.Practices.ESB.Itinerary.Schemas.ServiceName == "ScatterGather")
&& (Microsoft.Practices.ESB.Itinerary.Schemas.ServiceState ==
"Pending") && (Microsoft.Practices.ESB.Itinerary.Schemas.ServiceType
== "Orchestration")
ブローカー オーケストレーションは、旅程ステップの設定を分析し、旅程ステップに関連付けられたリゾルバーのコレクションを取得します。 これらのリゾルバーごとに、オーケストレーションは Microsoft BizTalk ESB Toolkit Resolver と Adapter Framework を使用してサービス エンドポイントを解決します。 ブローカー オーケストレーションは、次のパラメーターを使用して要求メッセージをディスパッチするために、n 個の ServiceDispatcher オーケストレーションを非同期的にアクティブ化します (n は、スケジュール内の ScatterGather サービスに関連付けられているリゾルバーの数)。
TransportLocation。 リゾルバーによってこのパラメーターが設定されます。
TransportType。 リゾルバーによってこのパラメーターが設定されます。
ResolverDictionary。 このパラメーターには、具象リゾルバー インスタンスによって設定された競合回避モジュールのファクトのコレクションが含まれています。
InboundMessage。 このパラメーターには、スケジュールを含む元のメッセージが含まれます。
ServiceResponsePort。 このパラメーターは、ServiceDispatcher オーケストレーションのインスタンスから応答を受信する自己相関応答ポートの名前です。
ServiceDispatcher オーケストレーションの各インスタンスは、ResolveMapScatterGather ポリシーを使用して、 TransportType プロパティと TransportLocation プロパティに基づいて、要求と応答メッセージの Microsoft BizTalk マップの種類を解決します。 オーケストレーション インスタンスは、解決されたマップを使用して、受信メッセージを Web サービス呼び出しの要求メッセージに変換します。
ESB アダプター マネージャーは、要求メッセージの送信トランスポート コンテキスト プロパティを設定します。このプロパティは、BizTalk によって ServiceRequestPort という名前の送信請求応答ポートに転送されます。
サービスから応答メッセージを受信すると、ServiceDispatcher オーケストレーションは解決されたマップ情報を使用して受信応答メッセージを正規形式に変換します。 次に、ServiceResponse エンベロープ内で変更された応答をラップし、自己相関ポートを介してブローカー オーケストレーションに転送します。 ブローカー オーケストレーションは、次のコードに示すように、すべての受信応答を集計し、GlobalBank.ESB.ScatterGather.Processes.AggregatingPipeline を使用して最終的な応答メッセージを準備します。
AggregatedResponse.Body = null;
AggregatedResponse(*) = InboundMessage(*);
Microsoft.XLANGs.Pipeline.XLANGPipelineManager.ExecuteSendPipeline(
typeof(GlobalBank.ESB.ScatterGather.Processes.AggregatingPipeline),
messageAggregator,AggregatedResponse);
このコードは、定義済みの封筒内の応答のバッチ全体をラップします。 次に、ブローカー オーケストレーションは、次のコードに示すように、 スケジュールを DynamicTest スケジュール ステップに進めます。
// Copy the context and advance the itinerary.
OutboundMessage = AggregatedResponse.Body;
OutboundMessage(*) = AggregatedResponse(*);
// Advance the Itinerary to the next step.
itinerary.Itinerary.Advance(OutboundMessage, itineraryStep);
DynamicTest という名前のサービス型属性は Messaging に設定されているため、ItineraryHelper クラスはリゾルバー プロパティを OutboundMessage という名前のメッセージのコンテキストに昇格させます。 ブローカー オーケストレーションは、BizTalk ダイレクト バインド ポートにこのメッセージを送信します。 BizTalk は、 ServiceName サブスクリプションによって表される動的送信ポート ( DynamicTest) にメッセージを転送します。 この送信ポートは、最終的な集計応答を \Source\Samples\DynamicResolution\Test\Filedrop\Out フォルダーにシリアル化します。