Large Messaging サンプルについて

Large Messaging サンプルは、1 日の終わりの販売データの処理のシナリオに基づく、メッセージ・フローの サンプル・アプリケーションです。 丸 1 日の販売の詳細を記録したメッセージがストアでまとめてバッチ処理され、IT センターに伝送できる状態になります。 IT センターがこれを受け取ると、続く処理に備えて、バッチ処理されたメッセージが構成要素の各部分に分割し戻されます。 この分割は WebSphere Message Broker メッセージ・フローを使用して行われます。個々のメッセージはそれぞれ 1 つの販売を表し、それぞれの構造は同一です。

このサンプル内の入出力メッセージは、単純化の目的で、自己定義型 XML メッセージとしてインプリメントされています。 他のメッセージ・フォーマットも容易に使用することができます。

各入力メッセージは、次の 3 つの部分から構成されています。

SaleList 構造は複雑な構造です。 これには以下が含まれます。

このサンプルの処理の目的は、SaleList 構造のそれぞれのインスタンスを別個の WebSphere MQ メッセージとして書き出す一方で、メモリー要件全体を最小限に抑えることです。仮想メモリーの使用は、メッセージ・ツリーの処理済み部分を削除することにより最小限に抑えられます。そうしないなら、SaleList 構造の各インスタンスが処理されるごとにメッセージ・ツリーが拡大し続けることになります。  

ハウスキーピングを行わないためにメッセージ・ツリーが拡大を続ける場合、メッセージ・フローを実行している実行グループの仮想メモリー要件が非常に大きくなる可能性があります。メガバイト数が大きなサイズの入力メッセージの場合、これは重大なパフォーマンスの問題になり得ます。入力メッセージのサイズによっては、仮想メモリーの要件が何百メガバイト、さらにはギガバイトにさえなる可能性があります。

サンプルで使用されるメモリー節約の技法には、可変的なメッセージ・ツリーを使用することが必要です。 これは、メッセージ・ツリーの一部を削除できるようなメッセージ・ツリーです。InputRoot のメッセージ・ツリーは不変的であるため、必要に応じて項目を除去することはできません。したがって、別のツリーをメッセージ・フロー内に作成します。ESQL ROW 変数および ESQL CREATE 関数呼び出しを使用することによって、これを確立します。 

サンプルの処理は、1 つのメッセージ・フローで構成されています。サンプルで実行される処理を以下に説明します。

Large messaging メッセージ・フロー

Large Messaging メッセージ・フローでは、以下の処理を実行します。

  1. XML ペイロードが入った WebSphere MQ メッセージをトランザクション制御下で読み取ります。
  2. SaleList 構造の各インスタンスごとに WebSphere MQ メッセージをフォーマット設定します。
  3. WebSphere MQ メッセージを出力キューへ書き込みます。
  4. 最後のエレメントが処理されたら、処理の完了をシグナル通知する WebSphere MQ メッセージを作成します。

Large Messaging メッセージ・フローは、以下のノードから構成されています。

MQInput ノード MessageWithRepeatingElements は、XML ペイロードが入った WebSphere MQ メッセージを読み取ります。着信メッセージは自己定義型 XML 形式なので、メッセージが正常に解析されるようにメッセージ・セットやメッセージ・フォーマットを指定する必要はありません。

Compute ノード ProduceMessageSlicesFromRepeatingElements には、メッセージ・フローの処理の大部分が収められています。ここでは、以下の処理を実行します。

  1. InputRoot.XMLNSC のコピーになる可変的なツリーを作成します (InputRoot のメッセージ・ツリーは不変的)。これは、メッセージ・フローの全体的なメモリー要件全体を低減するために行われます。
  2. 新しいメッセージ・ツリー用の XMLNSC パーサーを作成します。
  3. InputRoot.XMLNSC を新しいメッセージ・ツリーへコピーします。
  4. 入力メッセージのヘッダーにある SaleListCount フィールドの値を取得します。この値は、メッセージに繰り返される SaleList 項目の数を指定します。これは、処理された数と突き合わせて検査されます。
  5. SaleList 構造の各インスタンスごとに WebSphere MQ メッセージをフォーマット設定します。 
  6. フォーマット設定したメッセージをメッセージ・フローのそれ以降の部分へ送り、これを WebSphere MQ メッセージとして書き出せるようにします。これは PROPAGATE 動詞を使用して行います。
  7. WebSphere MQ メッセージのフォーマット設定と書き出しを行い、SaleEnvelope メッセージの処理を確認します。

Filter ノード IdentifyWhenSlicingIsComplete は、ノード ProduceMessageSlicesFromRepeatingElements で伝搬されたメッセージにフィルター式を適用します。このテストの目的は、ノードに入ってくるメッセージが、処理対象の SaleList メッセージのキューに書き込むべきものか、それともバッチ確認メッセージであるかを識別することです。これが SaleList 項目を含むメッセージである場合、処理は MQOutput ノード RepeatedElementSlices に進み、メッセージは WebSphere MQ キューに書き込まれます。フィルター IdentifyWhenSlicingIsComplete で受け取られたメッセージがバッチ確認メッセージである場合、このメッセージは、MQOutput ノード MessageSlicingComplete を使用することにより、WebSphere MQ メッセージとして、SaleList 項目とは異なるキューに書き込まれます。

メッセージ・フローには、様々なエラー条件の処理を提供する追加ノードがあります。MQOutput ノード General Failure は、MQInput ノードの Failure ターミナルに接続されています。 このノードは、MQInput ノード内の処理でエラーが発生したときに、メッセージを MQOutput ノードで指定されたキューに書き込みます。MQInput ノードの Catch ノードは、CatchProcessing という Filter ノードに接続されています。メッセージ・フローの先の部分で例外がスローされ、このノードによって catch されると、メッセージはこのルートをたどって伝搬されます。CatchProcessing 内のフィルター式は、処理されているメッセージが期待どおりのフォーマットになっているかどうかを判別します。期待どおりではない場合、処理はノード Throw Error に進み、ここでユーザー・エラーがスローされます。メッセージの何らかの点が誤った形式になっている場合 (最後のフィールドの名前が SlicingReport ではない場合など)、処理は MQOutput ノード Malformed Messages に進み、ここでメッセージがエラー・キューに書き込まれます。

テスト・メッセージ

メッセージ・ルーティング・サンプルの実行に使用するテスト・メッセージは、顧客の送り状明細が入った、自己定義型 XML メッセージです。 SaleList 項目を繰り返すと、メッセージのサイズを拡大することができます。 サンプルのメッセージでは SaleList 項目が 10 回繰り返されています。メッセージのレイアウトを以下に示します。ここでは SaleList の単一インスタンスのみを示します。

<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>

サンプルのホームに戻る