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