ブローカーは、すべてのメッセージ・フローについて基本的なエラー処理を行います。
基本処理が十分でない場合や、特定のエラー条件やエラー状態に対して特定のアクションを実行したい場合には、メッセージ・フローを拡張して独自のエラー処理を実行することもできます。
そのために使用できるオプションは、場合によっては非常に複雑になります。
特に MQInput ノードのために用意されているオプションは多岐にわたります。それらのノードは、持続メッセージやトランザクションも対象にしているからです。
MQInput は、WebSphere MQ の構成オプションの影響も受けます。
どんなエラーについても処理の方法はいろいろあるので、決まった手順をここで取り上げることはできません。
ここでは、エラー処理の原則を示し、使用可能なオプションについて説明します。その詳細情報を参考にしながら、それぞれの状況で必要な選択肢を組み合わせて活用するようにしてください。
メッセージ・フロー内で、これらのオプションのうちの 1 つまたは複数を選択できます。
- 任意のノードの failure ターミナルと、ノードの内部例外を処理するノード・シーケンス (fail フロー) を接続します。
- 入力ノードの catch ターミナルと、それらのノードの先で生成される例外を処理するノード・シーケンス (catch フロー) を接続します。
- MQInput ノードで受け取ったすべてのメッセージをトランザクション内で処理するかどうかを決めます。
- MQInput ノードで受け取ったすべてのメッセージを持続メッセージにするかどうかを決めます。
ユーザー定義のノードをメッセージ・フローに組み込む場合、そのノードに関するエラーを処理する方法を理解するには、そのノードに関して提供されている情報を参照する必要があります。
ここでは、組み込みノードだけを取り上げます。
エラー処理の方法を設計する場合、以下の要因について検討してください。
- 大半の組み込みノードには failure ターミナルが含まれています。例外は、Input、Output、Passthrough、Publication、Real-timeInput、Real-timeOptimizedFlow です。
例外がノード内で検出されると、メッセージと例外の情報がノードの failure ターミナルに伝搬されます。
ノードに failure ターミナルが含まれていない場合や、ノードが failure ターミナルに接続していない場合は、ブローカーが例外をスローし、その例外を処理できる入力ノードに制御を戻します。
MQinput ノードが内部エラーを検出した場合の動作は多少異なります。failure ターミナルに接続していない場合、それぞれのノードは、入力キューのバックアウト再キューイング・キューか、そのキューが定義されていない場合はブローカーのキュー・マネージャーの送達不能キューにメッセージを書き込もうとします。
- MQInput、および SCADAInput の各ノードには、catch ターミナルが含まれます。
メッセージが catch ターミナルに伝搬されるのは、メッセージが最初にその種のノードの先 (out ターミナルに接続しているノードなど) に伝搬された場合に限られます。
- メッセージが failure ターミナルまたは catch ターミナルに伝搬されると、ノードは新規の ExceptionList を作成し、発生したエラーを表す例外がそのリストに取り込まれます。
ExceptionList はメッセージ・ツリーの一部として伝搬されます。
- MQInput ノードには、トランザクション・メッセージに関する追加の処理があります (他の入力ノードはトランザクション・メッセージを処理しません)。
- $Root または $Body を指定した Trace ノードを組み込んだ場合は、メッセージ全体の構文解析が行われます。
したがって、それ以外の場合には検出されないパーサー・エラーが生成される場合もあります。
エラー処理の一般的な原則は以下のとおりです。
- 入力ノードの catch ターミナルに接続した場合、フローは out フロー内で生成されるすべての例外を処理します。
ブローカーは、catch フローで例外があった場合を除いて、ロールバックやアクションを実行しません。
例外が発生してキャッチされた後にロールバックを実行したい場合は、その動作を catch フロー内で用意する必要があります。
- MQInput ノードの catch ターミナルに接続しない場合は、failure ターミナルに接続し、そのノードによって生成された例外を処理するための fail フローを用意できます。
fail フローは、ノード内で例外が発生した時点でただちに呼び出されます。
メッセージがトランザクションの一部になっている場合、例外が MQInput ノードまたは ノードの先 (out フローか catch フロー) で生成されて、メッセージが入力キューに戻ったときに、バックアウト・カウントがバックアウトしきい値に達すると、やはり fail フローが呼び出されます。
SCADAInput ノードは、catch ターミナルに接続していない状況で例外がそのノードの先で生成されたときに、メッセージを failure ターミナルに伝搬しません。
- ノードがメッセージを catch フローに伝搬した後に、同じノードに制御を戻す別の例外が再度発生した場合、そのノードは catch ターミナルに接続していない場合と同じようにしてメッセージを処理します。
- 入力ノードの failure ターミナルにも catch ターミナルにも接続しない場合、ブローカーはデフォルトの処理を行います (デフォルトの処理は、入力ノードのタイプによって異なります)。
- 特定のエラーを処理する共通のプロシージャーがある場合、必要なノード・シーケンスを組み込んだサブフローを作成するのが適している状況もあります。
そのアクションを実行しなければならない位置にそのサブフローを組み込んでください。