Collector ノードのサンプルには、2 つの Collector ノードを持つメッセージ・フローが含まれています。
このサンプルは、以下のシナリオに基づいています。
次の 3 つのソースからの入力を取り入れて、注文に対する送り状が生成されます。
下の図は、CollectorNodeSampleFlow メッセージ・フローを示しています。
メッセージ・フロー中の最初の Collector ノードは、以下のことを例示します。
メッセージ・フロー中の 2 番目の Collector ノードは、以下のことを例示します。
図の Collector ノード上に表示されている警告シンボルは、Catch ターミナルが接続されていないことを示しています。
メッセージ・フローは、次の 3 つのソースから入力データを取り入れます。
<Invoice> <CustomerNumber>111</CustomerNumber> <Product>Toaster</Product> <Quantity>1</Quantity> <UnitPrice>4.99</UnitPrice> </Invoice>
<Order><OrderNumber>111</OrderNumber><Product>Toaster</Product><Quantity>1</Quantity><Delivery>2 days</Delivery></Order>
<Packaging> <CustomerNumber>111</CustomerNumber> <Postage>1.95</Postage> </Packaging>
3 つの入力ノードからの入力は、フロー中の最初の Collector ノード CollectByCustNum に送られます。そのノードは、各入力ソースからの 1 つのメッセージが、Collector ノード中に構成されている基準に合致したときに収集を完了するように構成されています。
メッセージ・コレクションへのメッセージを、着信データの内容に基づいて関連付けするために、パターン・マッチングを使用することができます。パターン・マッチングは、指定された入力ターミナルに対して定義できます。各入力ターミナルで構成されたパターン・マッチングは、パターン・マッチングを設定するために 2 つのフィールドを使用することができます。
Collector ノードにおいて、パターン・マッチングは「コレクション定義」テーブルに設定されます。このテーブルは、「プロパティー」ビューの「基本」ページにあります。
CollectByCustNum Collector ノードには、3 つの入力ノードから入力を収集するための 3 つの入力ターミナルがあります。
下の図は 3 つの入力ターミナルを示しています。
CollectByCustNum において、MQInput ノード MQ COLL_IN1 および FileInput ノード fileinput からの入力は、CustomerNumber によって関連付けられています。 入力ターミナル IN3 ではパターン・マッチングは不要ですが、その代わりに MQInput ノード MQ COLL_IN3 からの入力には、各コレクションに追加される郵送料金が含まれています。
次の例では、顧客番号は 111 です。 3 つの入力ターミナルへの入力は次のとおりです。
<Invoice> <CustomerNumber>111</CustomerNumber> <Product>Toaster</Product> <Quantity>1</Quantity> <UnitPrice>4.99</UnitPrice> </Invoice>入力ターミナル IN1 に設定された相関パスは、$Body/Invoice/CustomerNumber に設定されているので、上の入力データ中の相関値は顧客番号の 111 です。
入力ターミナル IN2 に設定された相関パスは、$LocalEnvironment/File/Name に設定されています。 入力ターミナル IN2 に設定された相関パターンは、* .order に設定されています。
FileInput ノードは、$LocalEnvironment/File/Name を、読み込まれたファイルの名前に設定します。サンプルでは、この値が 111.order に設定されています。 この設定を相関パスに使用し、さらにワイルドカード・パターンの *.order を相関パターンに設定することによって、入力と、入力ターミナル IN2 を、顧客番号 111 によって関連付けることができます。元の注文、倉庫からの配達情報、および郵送料金を含むサブツリーを持つメッセージ・コレクションが作成されます。
完了したメッセージ・コレクションは Compute ノード Compute1 に伝搬され、そこで入力が結合されて新しい送り状メッセージが作成されます。この Compute ノードは、以下のタスクを実行します。
Compute ノードが作成した新しいメッセージは、次のような構造を持っています。
<Invoice> <CustomerNumber>111</CustomerNumber> <Product>Toaster</Product> <Quantity>1</Quantity> <Price>8.94</Price> <Delivery>2 days</Delivery> </Invoice>
Compute1 で作成された送り状メッセージは、メッセージ・フロー中の 2 番目の Collector ノード CollectUntilTrigger に伝搬されます。この Collector ノードは、1 つの入力ターミナル IN4 を持っています。この Collector ノードでは、メッセージ・コレクションを完了するのに、最初の Collector ノードで使用された「数量」ではなく、「タイムアウト」プロパティーが使用されます。「タイムアウト」プロパティーは 30 秒に設定されているので、30 秒のタイムアウト期間内に受信されたすべてのメッセージが、完了したコレクションを形作ります。
このノードでは、イベント調整も使用可能になっています。Timeout Notification ノードが、Collector ノードの Control ターミナルに接続されています。したがって、完了したコレクションは、制御ターミナルが TimeoutNotification ノードによって起動されない限り、フロー中の次のノードに伝搬されません。TimeoutNotification ノードは、90 秒ごとにメッセージを送信するように設定されています。
メッセージ・コレクションは、Compute ノード Compute2 に送信されます。Compute ノードは各コレクションからメッセージ・データを取得し、最終的な出力メッセージを作るために時間および日付情報を追加します。Collector ノード CollectUntilTrigger の各コレクションに追加される送り状メッセージの数によっては、各コレクションに複数の送り状が含まれる場合があります。
最終的な出力メッセージは以下の形式になります。
<Invoices> <Invoice> <InvoiceNumber>111</InvoiceNumber> <Product>Toaster</Product> <NumberOrdered>1</NumberOrdered> <TotalCost>9.94</TotalCost> <Delivery>2 days</Delivery> </Invoice> <Invoice> <InvoiceNumber>222</InvoiceNumber> <Product>Food Processor</Product> <NumberOrdered>2</NumberOrdered> <TotalCost>75.93</TotalCost> <Delivery>4 days</Deliver> </Invoice> <Date>2007-08-10</Date> <Time>17:18:22</Time> </Invoices>
メッセージ・フロー中で、各 Collector ノードの後に Compute ノードが続くことに注意してください。Collector ノードの後には、Compute ノードまたは JavaCompute ノードが続かなければなりません。なぜならば、Collector ノードによって伝搬されるメッセージ・ツリーを構文解析できるのは、これらのノードのみだからです。Compute ノードまたは JavaCompute ノードを使用して、メッセージ・コレクションからメッセージ部分を取り出し、メッセージ・フローの他のノードで処理される新しいメッセージを生成することができます。