Coordinated Request Reply サンプルは、最新のアプリケーションと従来のアプリケーションとが、 要求/応答の処理パターンで WebSphere MQ メッセージを使用して通信するというシナリオに基づいた、 メッセージ・フロー・サンプル・アプリケーションです。最新のアプリケーションは自己定義型 XML メッセージを使用して要求メッセージを発行します。従来のアプリケーションは、カスタム・ワイヤー形式 (CWF) のメッセージを使用し、要求メッセージを受け取って処理し、応答メッセージを配信します。これらのアプリケーションが正常に通信するには、要求メッセージと応答メッセージの両方のメッセージ・フォーマットを変換しなければなりません。
このサンプルでは、自己定義型 XML メッセージと CWF メッセージの間で変換を行う方法の例を示します。さらにこのサンプルでは、どうすれば一方のメッセージ・フローで保管した情報を、別のメッセージ・フローで取り出せるかも示します。このサンプルでは、最初の要求メッセージの ReplyToQ と ReplyToQMgr を保存しておき、対応する応答メッセージを受信するときに使用できるようにしておく必要があります。このシナリオでは、詳細を保管するために WebSphere MQ メッセージを使用します。
サンプルの処理は、3 つのメッセージ・フローと 1 つのメッセージ・セットで構成されています。メッセージ・フローは、以下のとおりです。
これは、このサンプル用のテスト・メッセージを書き出すことのできるアプリケーションから要求メッセージを 読み取り、ペイロードを XML から CWF に変換し、CWF 形式のペイロードの入った出力メッセージを書き出します。 次いで、Backend Reply メッセージ・フロー (従来のアプリケーションをシミュレートする) がこのメッセージを読み取って処理します。
これは、CWF 形式のペイロードの入った WebSphere MQ メッセージを受け取る、 従来のアプリケーションをシミュレートするものです。内容に対して処理を実行し、CWF 形式のペイロードの入った応答 WebSphere MQ メッセージを書き出します。
これは、Backend Reply メッセージ・フローから応答メッセージを読み取り、ペイロードを CWF から XML に変換して、XML 形式のペイロードが入った出力メッセージを書き出します。次いで、発信元のアプリケーションがこのメッセージを読み取って処理します。
処理の要求セクションにおける XML 形式から CWF へのメッセージ変換、および処理の応答セクションにおける CWF から XML への変換では、メッセージ・セット Sample MSET とメッセージ定義 SaleListMessage を使用します。
メッセージ・フローの詳細と、メッセージ・フローで実行される処理について、以下に説明します。
Request メッセージ・フローでは、以下の処理を実行します。
Request メッセージ・フローは、以下のノードから構成されています。
MQInput ノード GetRequestMsg は XML メッセージを読み取ります。着信メッセージは自己定義型 XML 形式なので、メッセージが正常に解析されるようにメッセージ・セットやメッセージ・フォーマットを指定する必要はありません。
サブフロー StoreOriginalMQMD_Sub は、WebSphere MQ メッセージへの ReplyToQ 値と ReplyToQMgr 値の保管をカプセル化します。 カプセル化する理由は 2 つあります。 1 つ目の理由は、処理ロジックを他のメッセージ・フローで簡単に再利用できるようにするためです。2 つ目の理由は、代替インプリメンテーションに置き換えることができるようにするためです。例えば、データベース・ノードを使用する代替インプリメンテーションを作成できるかもしれません。
Compute ノード TransformAndSetReplyTo の実行するアクションは、次のとおりです。
MQOutput ノード OutputRequestMsg は、WebSphere MQ 出力メッセージを書き出します。
Backend Reply メッセージ・フローでは、以下の処理を実行します。
Backend Reply メッセージ・フローは、以下のノードから構成されています。
MQInput ノード GetRequestMsg は CWF メッセージを読み取ります。 着信メッセージを解析するために必要なメッセージ・セット、フォーマット、およびドメインは、MQInput ノードで指定されます。
Compute ノード Backend_Computation の実行するアクションは、次のとおりです。
MQOutput ノード PutReplyMsg は、WebSphere MQ 出力メッセージを書き出します。
Reply メッセージ・フローでは、以下の処理を実行します。
Reply メッセージ・フローは、以下のノードから構成されています。
MQInput ノード GetBackendReply は CWF メッセージを読み取ります。 着信メッセージを解析するために必要なメッセージ・セット、フォーマット、およびドメインは、MQInput ノードで指定されます。
Compute ノード MapToRequestor の実行するアクションは、次のとおりです。
サブフロー RestoreOriginalMQMD_Sub は、ReplyToQ 値と ReplyToQMgr 値の取り出しをカプセル化します。このサブフローは、元の要求メッセージで指定された ReplyToQ と ReplyToQMgr の値が入った WebSphere MQ メッセージを読み取り、これらの値を応答メッセージにコピーします。 このサブフローは、MQGet ノードを使用して読み取りを行います。 MQGet ノードは、相関 ID によって対応するメッセージを選択し、処理されるメッセージの MQMD に元の要求 MQMD をコピーするように構成されています。これは、従来のアプリケーションから正しいリクエスター・アプリケーションに応答メッセージを送信するためです。 MQGet ノードは、ReplyToQ と ReplyToQMgr の元の値を保管するために使用された WebSphere MQ メッセージのペイロードの 取り出しも行います。
MQOutput ノード PutOriginalReply は、WebSphere MQ 出力メッセージを書き出します。
Coordinated Request Reply サンプルで使用されるテスト・メッセージは、顧客の送り状明細が入った単純な XML メッセージです。 サンプルの実行中に、この XML メッセージは CWF 形式に変換されます。 CompletionTime フィールド値だけが、サンプルの実行中に変更される値です。 以下にこのメッセージを示します。
<SaleEnvelope>
<Header>
<SaleListCount>1</SaleListCount>
</Header>
<SaleList>
<Invoice>
<Initial>K</Initial>
<Initial>A</Initial>
<Surname>Braithwaite</Surname>
<Item>
<Code>00</Code>
<Code>01</Code>
<Code>02</Code>
<Description>Twister</Description>
<Category>Games</Category>
<Price>00.30</Price>
<Quantity>01</Quantity>
</Item>
<Item>
<Code>02</Code>
<Code>03</Code>
<Code>01</Code>
<Description>The Times Newspaper</Description>
<Category>Books and Media</Category>
<Price>00.20</Price>
<Quantity>01</Quantity>
</Item>
<Balance>00.50</Balance>
<Currency>Sterling</Currency>
</Invoice>
<Invoice>
<Initial>T</Initial>
<Initial>J</Initial>
<Surname>Dunnwin</Surname>
<Item>
<Code>04</Code>
<Code>05</Code>
<Code>01</Code>
<Description>The Origin of Species</Description>
<Category>Books and Media</Category>
<Price>22.34</Price>
<Quantity>02</Quantity>
</Item>
<Item>
<Code>06</Code>
<Code>07</Code>
<Code>01</Code>
<Description>Microscope</Description>
<Category>Miscellaneous</Category>
<Price>36.20</Price>
<Quantity>01</Quantity>
</Item>
<Balance>81.84</Balance>
<Currency>Euros</Currency>
</Invoice>
</SaleList>
<Trailer>
<CompletionTime>12.00.00</CompletionTime>
</Trailer>
</SaleEnvelope>