WebSphere® MQ から受け取ったメッセージの順序を変更し、XML メッセージで定義されているシーケンス番号に基づいて正しい順序でメッセージを伝搬します。
この例の作業では、開始シーケンス番号 0 (デフォルト) でシーケンスを定義します。そのシーケンスは、グループの新しいメッセージを 60 秒間受け取らなかった時点で終了します。 メッセージ・フローの構成では、メッセージの着信は順不同としますが、伝搬に関しては、Resequence ノードが正しい順序で各メッセージを伝搬しようとする、という構成内容にします。 シーケンス内の必要なメッセージが 10 秒以内に着信しないと、Resequence は、その欠落メッセージをスキップし、たとえ順序が乱れるとしてもシーケンス内の次のメッセージを伝搬します。
ここでは、WebSphere MQ から XML 文書を受け取り、XML メッセージで定義されているシーケンス番号に基づいてメッセージを再配列し (この例では、パス $Root/XMLNSC/Doc/SeqNo を使用)、WebSphere MQ キューにその文書を書き込むメッセージ・フローを作成する手順を説明します。
- Resequence_Task2 というメッセージ・フローを作成し、MQInput ノード、Resequence ノード、MQOutput ノードを組み込みます。 これを行う方法の詳細は、メッセージ・フローの作成を参照してください。
- MQInput ノードの Out ターミナルを Resequence ノードの In ターミナルに接続します。
- Resequence ノードの Out、Missing、Expire の各ターミナルを MQOutput ノードの In ターミナルに接続します。
- MQInput ノードの以下のプロパティーを設定します。
- 「基本」タブで、「キュー名」プロパティーを RESEQUENCE_TASK2_IN1 に設定します。
- 「入力メッセージの構文解析」タブで、「メッセージ・ドメイン」プロパティーを XMLNSC に設定します。
- Resequence ノードの「基本」タブで、以下のプロパティーを設定します。
- 「シーケンス番号へのパス」プロパティーを $Root/XMLNSC/Doc/SeqNo に設定します。
- 「欠落しているメッセージ・タイムアウト」プロパティーを 10 に設定します。
- 「シーケンス定義の終了」プロパティーを、値 60 の「自動」に設定します。
- MQOutput ノードで、「キュー名」プロパティー (「基本」 タブ上) を RESEQUENCE_TASK2_OUT1 に設定します。
- メッセージ・フローを保存します。
メッセージ・フローのメッセージ処理:
このセクションでは、メッセージ・フローに入ったメッセージを Resequence ノードがどのように処理するのかを説明します。
- 以下のようなメッセージが WebSphere MQ キュー RESEQUENCE_TASK2_IN1 に着信します。
<Doc><SeqNo>0</SeqNo></Doc>,<Doc><SeqNo>1</SeqNo></Doc>,<Doc><SeqNo>2</SeqNo></Doc>,
<Doc><SeqNo>3</SeqNo></Doc>,<Doc><SeqNo>4</SeqNo></Doc>,<Doc><SeqNo>5</SeqNo></Doc>,
<Doc><SeqNo>6</SeqNo></Doc>,<Doc><SeqNo>7</SeqNo></Doc>,<Doc><SeqNo>8</SeqNo></Doc>,
- Resequence ノードは、まずシーケンス番号 0 のメッセージを受け取ります。Resequence ノードは、再配列プロセスを管理するための新しいシーケンス・グループを作成します。その新しいシーケンス・グループは、デフォルト・グループです。メッセージでは、シーケンス・グループが定義されていないからです。 そのシーケンス番号 0 のメッセージがシーケンスの最初のメッセージになり、Out ターミナルに伝搬します。
- Resequence ノードは、残りのメッセージ (シーケンス番号 8 までのメッセージ) を受け取り、着信順に伝搬します。
Resequence ノードは、各メッセージを伝搬する前にいったん保管し、別々のトランザクションを使用して各メッセージを下流に伝搬します。
- 60 秒が経過し、シーケンス・グループが閉じます。
- 次に、以下のようなメッセージが WebSphere MQ キュー RESEQUENCE_TASK2_IN1 に着信します。
<Doc><SeqNo>0</SeqNo></Doc>,<Doc><SeqNo>3</SeqNo></Doc>,<Doc><SeqNo>2</SeqNo></Doc>,
<Doc><SeqNo>4</SeqNo></Doc>,<Doc><SeqNo>6</SeqNo></Doc>,<Doc><SeqNo>7</SeqNo></Doc>,
- Resequence ノードは、まずシーケンス番号 0 のメッセージを受け取ります。その時点で、Resequence ノードは、新しい (デフォルトの) シーケンス・グループを作成し、シーケンス番号 0 のメッセージを Out ターミナルに伝搬します。
- 次のメッセージのシーケンス番号は 3 です (つまり、ここで順序が乱れています)。
Resequence ノードの「欠落しているメッセージ・タイムアウト」プロパティーには 10 秒という値が設定されているので、そのタイマーがスタートします。
- シーケンス番号 2 が着信します。このメッセージもやはり次の必要なメッセージではありませんが、現時点で保管されている最小のシーケンス番号よりも小さいシーケンス番号のメッセージなので、欠落メッセージのタイマーがリセットされます。
- Resequence ノードは、残りのメッセージを受け取ります。いずれも、2 よりも大きいシーケンス番号のメッセージです。したがって、それらのメッセージを伝搬しないで保管します。 今回は、それぞれのシーケンス番号が 2 よりも大きいので、欠落メッセージのタイマーはリセットされません。
- シーケンス番号 1 は、指定の期間内に着信しません。10 秒が経過した時点でタイムアウト期間の有効期限が切れます。
- Resequence ノードは、保管していたすべてのメッセージを伝搬します。つまり、最小のシーケンス番号 (この場合は 2) から次の欠落シーケンス番号までのすべてのメッセージです (この場合は、シーケンス番号 3 と 4 のメッセージになります)。 つまり、メッセージ 2、3、4 を Expire ターミナルに伝搬します。
- Resequence ノードは、このシーケンス・グループに関して順不同状態に移ります。したがって、このグループのメッセージを Out ターミナルに伝搬することはありません。 Resequence ノードは、そのシーケンス・グループの有効期限が切れてグループが閉じるまで、そのグループに関しては順不同状態のままになります。
- さらに 10 秒が経過し、欠落メッセージのタイマーの有効期限が再び切れた時点で、メッセージ 6 と 7 を Expire ターミナルに伝搬します。
この時点で、欠落メッセージがなくなったので、欠落メッセージのタイマーは再開しません。
- グループの有効期限タイマーがスタートし、60 秒が経過すると、グループが閉じます。 グループの有効期限タイマーは、欠落メッセージのタイマーが稼働している間はスタートしません。