集約フローを使用する場合、例外またはデータベースのデッドロックが生じることがあります。 このトピックでは、この対処方法について説明します。
始める前に:
このタスクを実行するには、以下のタスクを完了している必要があります。
AggregateReply ノードのダウンストリームでエラーが検出される場合、ブローカーは例外をスローします。 また、メッセージ・フロー内の別のノードも、ESQL THROW ステートメントを使用して例外をスローします。 いずれの場合にも、例外がスローされた場合、それは以下の 2 つの場所のどちらかでキャッチされます。
下の表では、イベントと、AggregateReply ノードのダウンストリームにスローされた例外に生じる事柄をリストしています。
イベント | 伝搬されるメッセージ | 出力ターミナル | 例外がキャッチされる場所 |
---|---|---|---|
予期された応答が入力ノードに到着し、AggregateReply ノードの In ターミナルに渡される。 これが集約の完成に必要な最後の応答。 | すべての応答を含む集約された応答メッセージ | Out | Input ノード |
予期しない応答が入力ノードに到着し、AggregateReply ノードに渡される。 これが有効な応答として認識されず、 「Unknown Message Timeout (不明なメッセージ・タイムアウト)」プロパティーが 0 に設定されている。 | 受け取られたメッセージ | Unknown | Input ノード |
集約のすべての応答がまだ到着していないのでタイムアウトが生じる。 | 受け取ったすべての応答を含む集約された応答メッセージ | Timeout | AggregateReply ノード |
保持されたメッセージが有効な応答と認識されなかったために、不明タイムアウトが生じる。 | 保持されたメッセージ | Unknown | AggregateReply ノード |
最後の応答が到着したとき以外に、集約の完成したことが判明した。 | すべての応答を含む集約された応答メッセージ | Out | AggregateReply ノード |
集約フローで生じるエラーを処理する場合、 メッセージ・フローのそれぞれのノードのインスタンスすべてにおいて、 これらの例外をキャッチする必要があります。 これを行うには、次のようにします。
エラー処理に対する統合アプローチを行うには、これらのノードすべての catch ターミナルをノードの単一シーケンスに接続するか、または 1 つの一貫した方法でエラーを処理するサブフローを作成し、それをそれぞれの catch ターミナルに接続します。
以下の ESQL の例は、 MQMD ヘッダーを追加して、AggregateReply ノードが受信する応答を渡す方法を示しています。
-- Add MQMD SET OutputRoot.MQMD.Version = 2; . -- Include consolidated replies in the output message SET OutputRoot.XML.Data.Parsed = InputRoot.ComIbmAggregateReplyBody; .
例外についての情報を出力メッセージで伝搬したい場合は、 Compute ノードの 「計算モード (Compute Mode)」プロパティーに Exception を含む値を設定する必要もあります。
AggregateRequest および AggregateReply ノードは、 テーブル BAGGREGATE 内の集約された要求処理に関連した情報の書き込みおよび読み取りのために、 ブローカー・データベースにアクセスします。 デッドロックは、複数のリソースが同時にデータベース・テーブルにアクセスしようとするときに生じることがあります。
データベースのデッドロックを回避するには、以下のようにします。
この問題が生じる場合には、 DB2 コマンド・ウィンドウで次のように入力して次のキーロックを使用不可にします。
db2set DB2_RR_TO_RS=YES
このコマンドが完了したら、DB2 データベース・マネージャーを再始動してください。 このコマンドは、このデータベースの操作には他の影響はありません。
別のデータベースを使用している場合、これらのデッドロックは生じません。
注意 |
商標 |
ダウンロード |
ライブラリー |
技術サポート |
フィードバック
![]() ![]() |
ac12340_ |