MQInput ノードは、持続メッセージとトランザクション・メッセージのエラーを処理する際に以下のアクションを実行します。 非トランザクション・メッセージで検出されるエラーは、入力ノードにあるエラーの管理で説明されているとおりに処理されます。
このアクションについては、以下の表で要約されています。
エラー・イベント | Failure ターミナルに接続している | Failure ターミナルに接続していない | Catch ターミナルに接続している | Catch ターミナルに接続していない |
---|---|---|---|---|
ノードが内部エラーを検出 | Failure ターミナルに接続されているフローがエラーを処理する | メッセージは代替キューに書き込まれ、書き込みに失敗した場合はノードが再試行する | 適用外 | 適用外 |
ノードがメッセージを out ターミナルに伝搬すると、out フローで例外が発生する | 適用外 | 適用外 | Catch ターミナルに接続されているフローがエラーを処理する | ノードが再試行 |
ノードがメッセージを Catch ターミナルに伝搬すると、Catch ターミナルに接続されているフローで例外が発生する | エラーがログに記録され、メッセージがロールバックされる | エラーがログに記録され、メッセージがロールバックされる | 適用外 | 適用外 |
ノードがメッセージを Failure ターミナルに伝搬すると、Failure ターミナルに接続されているフローで例外が発生する | 適用外 | 適用外 | ノードが再試行 | ノードが再試行 |
メッセージが入力キューへロールバックされると、ノードは再試行処理を試みます。 ノードはメッセージが以前にバックアウトされているかどうかを調べ、バックアウトされている場合には、バックアウト・カウントがバックアウトしきい値に達しているか (等しいか) どうかを調べます。 各メッセージのバックアウト・カウントは、MQMD の WebSphere MQ によって保守されます。
キューの作成時に、バックアウトしきい値属性 BOTHRESH を指定 (または、デフォルトで 0 になるように) します。 デフォルト値 0 を受け入れると、ノードはこの値を 1 に増やします。 また、現行値を検出できなかった場合にもこの値を 1 に設定します。 これは、メッセージが以前にバックアウトされていない場合、それが少なくとも 1 回バックアウトおよび再試行されることを意味します。
Failure ターミナルの先で障害が発生した場合、MQMD のバックアウト・カウント・フィールドが入力キュー用に設定されたバックアウトしきい値の 2 倍に達するまで再試行が行われます。 この限度に達した場合、ノードは別のキューにメッセージを書き込もうとします。
メッセージは廃棄できないため、メッセージ・フローはメッセージのバックアウトを試行し続けます。 エラー状態は、ローカル・エラー・ログにエラーを書き込むことによって記録されます。 2 回目以降にこのエラーが示されるときには、入力キューのメッセージにある BackoutCount の値が継続的に増えていきます。
キューが存在しないためにこの状態が発生している場合、上に挙げられているいずれかのバックアウト・キューを定義することによって解決できます。 何がメッセージの処理を妨げているのかがはっきりしている場合は、一時的に BOTHRESH 属性の値を増やすことができます。このようにすることによって、メッセージには強制的に通常の処理が実行されます。
WebSphere MQ はメッセージ・グループをサポートします。 メッセージを 1 つのグループに追加して、そのメッセージの処理を他のメッセージと連動させることを指定できます (つまり、すべてのメッセージをコミットするか、ロールバックするということです)。 グループとしてまとめたメッセージをブローカーに送信する場合、メッセージ・フローが正しく構成されていれば、この状態は維持され、グループ・メッセージの処理時にエラーは発生しません。
グループとしてまとめたメッセージを正しく処理するためにメッセージ・フローを構成するには、MQInput ノードで説明されている処置を実行してください。ただし、メッセージのいずれかを処理中にエラーが発生した場合、メッセージ・グループの正しい処理は保証されません。
説明されているとおりに MQInput ノードを構成した場合、通常の環境下では、グループ内のすべてのメッセージが、グループ内の最後のメッセージが正常に処理された時点でコミットされる単一の作業単位で処理されます。 ただし、グループ内の最後のメッセージが処理される前にエラーが発生した場合には、エラーを生成したメッセージを含め、すべてのメッセージを組み込む作業単位が、ここで解説された規則によって定義されるエラー処理に従って処理されます。 その結果、その作業単位がバックアウトされることがあります。
ただし、グループ内に残っているメッセージはいずれも、メッセージ・フローによって正常に読み取られて処理され、新しい作業単位で処理されコミットされる可能性があります。 最後のメッセージが検出されて処理される時点で、コミットが発行されます。 したがって、グループ内でエラーが発生したが、それが最初または最後のメッセージではない場合には、グループの一部はバックアウトされ、他の部分はコミットされる可能性があります。
ユーザーのメッセージ処理要件では、この状態を特定の仕方で処理することが求められる場合は、 メッセージ・グループ内のエラーを処理するための、追加のエラー処理を準備する必要があります。たとえば、データベース内のメッセージ・グループの障害を記録したり、 各メッセージの検索時にデータベース上にチェックを入れ、 現行グループにすでにエラーが検出されている場合にはロールバックを強制したりすることができます。 これにより、メッセージのグループ全体がバックアウトされ、すべてが正常に処理されるまでは処理されないことになります。