7.7.3 MDB(WS-R)実行時の障害対策
(1) MDB(WS-R)でのエラーの伝わり方
MDB(WS-R)でのサービス部品呼び出しでは,サービスリクエスタとHCSCサーバの間,HCSCサーバとサービス部品の間でエラーは伝わりません。検知できる障害の種類と,ログおよびトレースの出力先を説明します。
- サービス部品でユーザ定義例外のエラーが発生した場合
-
サービス部品でユーザ定義例外のエラーが発生した場合のMDB(WS-R)でのエラーの伝わり方を次の図に示します。
図7‒67 サービス部品でユーザ定義例外のエラーが発生した場合のMDB(WS-R)でのエラーの伝わり方 サービス部品で発生した例外は,サービス部品稼働マシン上のReliable Messagingでエラー処理します。サービス部品稼働マシン上のReliable Messagingはローカルキューからメッセージの取り出しに失敗したことを示すメッセージをサービス部品稼働マシン上のログに出力します。
なお,ユーザ定義例外(アプリケーション例外)の場合,ロールバックして再度サービス部品でメッセージを取り出すかどうかは,サービス部品稼働マシン側のReliable Messagingの設定やサービス部品プログラムの作成に依存します。
サービス部品稼働マシン上のメッセージの取り出しでロールバックして,ロールバックの回数(メッセージの配送回数)が最大値に達した場合や,メッセージが有効期限に達した場合,そのメッセージはデッドメッセージキューに移動します。ただし,次の場合はメッセージが削除されます。
-
デッドメッセージキューの設定をしていない場合
-
配送回数に無制限の設定をしている場合
-
デッドメッセージキューのメッセージ数が超過した場合
-
データベースに障害が発生した場合
Reliable Messagingの詳細については,マニュアル「Reliable Messaging」を参照してください。
-
- サービス部品でユーザ定義例外以外のエラーが発生した場合
-
サービス部品でユーザ定義例外以外のエラーが発生した場合のMDB(WS-R)でのエラーの伝わり方を次の図に示します。
図7‒68 サービス部品でユーザ定義例外以外のエラーが発生した場合のMDB(WS-R)でのエラーの伝わり方 サービス部品で発生した例外は,サービス部品稼働マシン上のReliable Messagingでエラー処理します。Reliable Messagingはローカルキューからメッセージの取り出しに失敗したことを示すメッセージをサービス部品稼働マシン上のログに出力します。
なお,システム例外の場合,サービス部品側でロールバックして,再度サービス部品でメッセージの取り出しを試みます。
サービス部品稼働マシン上のメッセージの取り出しでロールバックして,ロールバックの回数(メッセージの配送回数)が最大値に達した場合や,メッセージが有効期限に達した場合,そのメッセージはデッドメッセージキューに移動します。ただし,次の場合はメッセージが削除されます。
-
デッドメッセージキューの設定をしていない場合
-
配送回数に無制限の設定をしている場合
-
デッドメッセージキューのメッセージ数が超過した場合
-
データベースに障害が発生した場合
Reliable Messagingの詳細については,マニュアル「Reliable Messaging」を参照してください。
-
- HCSCサーバ稼働マシンからサービス部品稼働マシンへの転送でエラーが発生した場合
-
HCSCサーバ稼働マシンからサービス部品稼働マシンへの転送でエラーが発生した場合のMDB(WS-R)でのエラーの伝わり方を次の図に示します。
図7‒69 HCSCサーバ稼働マシンからサービス部品稼働マシンへの転送でエラーが発生した場合のMDB(WS-R)でのエラーの伝わり方 HCSCサーバ稼働マシンからサービス部品稼働マシンへのメッセージの転送に失敗した場合,HCSCサーバ側のReliable Messagingでエラー処理をします。Reliable Messagingはメッセージの転送に失敗したことを示すメッセージをHCSCサーバ稼働マシン上のログに出力します。
なお,メッセージの転送でエラーを検知した場合,HCSCサーバ側でロールバックして再度転送を試みます。
HCSCサーバ稼働マシンからの転送でロールバックして,ロールバックの回数(メッセージの配送回数)が最大値に達した場合や,配送回数に無制限の設定をしている場合,そのメッセージはデッドメッセージキューに移動します。デッドメッセージキュー名を設定していない場合やデッドメッセージキューを作成していない場合は,無限にサービス部品を呼び出す処理が再実行されるため,必ずデッドメッセージキュー名やデッドメッセージキューを設定してください。
Reliable Messagingのセットアップについては,「3.1.2 実行環境に必要なソフトウェアを設定する」を参照してください。Reliable Messagingのキュー間転送の障害時の動作の詳細については,マニュアル「Reliable Messaging」の「2.4.7 キュー間転送の障害時の動作」を参照してください。
- HCSCサーバからエラーが発生した場合
-
HCSCサーバからエラーが発生した場合のMDB(WS-R)でのエラーの伝わり方を次の図に示します。
図7‒70 HCSCサーバからエラーが発生した場合のMDB(WS-R)でのエラーの伝わり方 図中の各エラーには,次に示すケースが該当します。
-
エラー1:要求パラメタ不正など
-
エラー2:宛先(ロケーション)が見つからない,サービスアダプタが停止しているなど
-
エラー3:データ変換に失敗したなど
-
エラー4:メッセージ送信失敗など
HCSCサーバで図中のエラー1〜エラー3のどれかを検知した場合,HCSCサーバ稼働マシン上のReliable Messagingでエラー処理します。図中のエラー4を検知した場合,発生したエラーの例外を標準受付にそのままスローするか,サービスアダプタでエラーの例外をフォルト電文に変換するか選択できます。例外発生時に取得するエラーの選択方法については,「7.11 サービスアダプタでの例外発生時の運用」を参照してください。
発生したエラーのメッセージをメッセージログに出力します。また,Reliable Messagingはローカルキューからメッセージの取り出しに失敗したことを示すメッセージをHCSCサーバ稼働マシン上のログに出力します。
なお,HCSCサーバでエラーを検知した場合,HCSCサーバ側でロールバックをして,再度サービス部品でメッセージの取り出し(サービス部品呼び出し)を試みます。HCSCサーバ稼働マシン上のメッセージの取り出しでロールバックして,ロールバックの回数(メッセージの配送回数)が最大値に達した場合,そのメッセージはデッドメッセージキューに移動します。デッドメッセージキュー名を設定していない場合やデッドメッセージキューを作成していない場合は,無限にサービス部品を呼び出す処理が再実行されるため,必ずデッドメッセージキュー名やデッドメッセージキューを設定してください。
Reliable Messagingのセットアップについては,「3.1.2 実行環境に必要なソフトウェアを設定する」を参照してください。
Reliable Messagingの詳細については,マニュアル「Reliable Messaging」を参照してください。
-
- サービスリクエスタ稼働マシンからHCSCサーバ稼働マシンへの転送でエラーが発生した場合
-
サービスリクエスタ稼働マシンからHCSCサーバ稼働マシンへの転送でエラーが発生した場合のMDB(WS-R)でのエラーの伝わり方を次の図に示します。
図7‒71 サービスリクエスタ稼働マシンからHCSCサーバ稼働マシンへの転送でエラーが発生した場合のMDB(WS-R)でのエラーの伝わり方 サービスリクエスタ稼働マシンからHCSCサーバ稼働マシンへのメッセージの転送に失敗した場合,サービスリクエスタ側のReliable Messagingでエラー処理します。Reliable Messagingはメッセージの転送に失敗したことを示すメッセージをサービスリクエスタ稼働マシン上のログに出力します。
なお,メッセージの転送でエラーを検知した場合,サービスリクエスタ側でロールバックして,再度転送を試みます。
サービスリクエスタ稼働マシンからの転送でロールバックして,ロールバックの回数(メッセージの配送回数)が最大値に達した場合や,メッセージが有効期限に達した場合,そのメッセージはデッドメッセージキューに移動します。ただし,次の場合は,メッセージは削除されます。
-
デッドメッセージキューの設定をしていない場合
-
配送回数に無制限の設定をしている場合
-
デッドメッセージキューのメッセージ数が超過した場合
-
データベースに障害が発生した場合
Reliable Messagingのキュー間転送の障害時の動作の詳細については,マニュアル「Reliable Messaging」の「2.4.7 キュー間転送の障害時の動作」を参照してください。
-
- サービスリクエスタでエラーを検知した場合
-
サービスリクエスタでエラーを検知した場合のMDB(WS-R)でのエラーの伝わり方を次の図に示します。
図7‒72 サービスリクエスタでエラーを検知した場合のMDB(WS-R)でのエラーの伝わり方 サービスリクエスタから転送キューへメッセージの送信ができなかった場合,サービスリクエスタへ例外(JMSException)がスローされます。サービスリクエスタは,例外をキャッチし,キャッチした例外オブジェクトのgetterを使用することで,発生したエラーの詳細を取得できます。サービスリクエスタ稼働マシンからのメッセージ送信失敗の場合は,デッドメッセージキューに移動しません。Reliable MessagingおよびJMSの詳細については,マニュアル「Reliable Messaging」を参照してください。
- 同期のサービス部品を呼び出してユーザ定義例外のエラーが発生した場合
-
同期のサービス部品を呼び出してユーザ定義例外のエラーが発生した場合のMDB(WS-R)でのエラーの伝わり方を次の図に示します。
図7‒73 同期のサービス部品を呼び出してユーザ定義例外のエラーが発生した場合のMDB(WS-R)でのエラーの伝わり方 非同期(MDB(WS-R))の標準受付に対してサービス部品を呼び出すときに応答用のキューを指定して,非同期(MDB(WS-R))の標準受付から同期のSOAPアダプタのサービス部品を呼び出します。このとき,サービス部品側でユーザ定義例外が発生すると,エラー情報のメッセージが応答用のキュー(転送キュー)に送信されます。
転送キューの送信先をサービスリクエスタ側のローカルキューに指定しておくと,そこからメッセージを取り出すことで,エラーの内容を取得できます。
応答用のキュー(転送キュー)はあらかじめ作成して準備しておく必要がありますが,応答用のキューの設定をしていない場合や,応答用のキューのメッセージ数が超過し,応答用のキューへの送信が失敗した場合,HCSCサーバ内で処理がロールバックし,標準受付のローカルキューからメッセージが再送されます(サービス部品側の処理(トランザクション)はロールバックしません)。
ロールバックの回数(メッセージの配送回数)が最大値に達した場合,そのメッセージはデッドメッセージキューに移動します。デッドメッセージキュー名を設定していない場合,およびデッドメッセージキューを作成していない場合,無限にサービス部品を呼び出す処理が再実行されるため,必ずデッドメッセージキュー名やデッドメッセージキューを設定してください。
(2) 問題発生個所の切り分け方
サービスリクエスタから標準受付(MDB(WS-R))を使用して,サービス部品を呼び出した場合の問題発生個所の切り分け方について説明します。切り分け方を次の図に示します。
- (i)サービス部品稼働マシンでのエラーの場合
-
サービス部品稼働マシン側のReliable Messagingが出力する障害情報を参照して,障害を調査します。サービス部品のプログラムでエラー情報を出力している場合は,J2EEサーバのユーザログを参照します。
要因は,次の観点で調査してください。
-
サービスリクエスタから要求したユーザ電文
-
サービス部品稼働マシン
-
サービス部品稼働マシンのReliable Messagingの設定
-
サービス部品のプログラム
-
- (ii)HCSCサーバ稼働マシンでのエラーの場合
-
HCSCサーバ稼働マシン側のメッセージログ,またはHCSCサーバ稼働マシン側のReliable Messagingが出力する障害情報を参照して,障害を調査します。
要因は,次の観点で調査してください。
-
サービスリクエスタから要求した引数の内容
-
HCSCサーバの設定または状態
-
HCSCサーバのReliable Messagingの設定
-
サービスアダプタの定義内容
-
ビジネスプロセスの定義内容
-
サービスリクエスタから要求したユーザ電文
-
ネットワークの状態
-
- (iii)サービスリクエスタ稼働マシンでのエラーの場合
-
サービスリクエスタがキャッチした例外からエラーの内容を取得できます。取得した例外のエラー情報を基に対処します。または,サービスリクエスタ稼働マシン側のReliable Messagingが出力する障害情報を参照して,障害を調査します。
要因は,次の観点で調査してください。
-
サービスリクエスタ稼働マシンのJ2EEコンテナの設定または状態
-
サービスリクエスタ稼働マシンのReliable Messagingの設定
-
ネットワークの状態
-
(3) そのほかの障害要因の特定方法(サービス部品呼び出し要求の実行履歴の追跡)
サービスリクエスタから指定した情報や,HCSCサーバからの情報を基に,サービス部品呼び出しの処理がどこまで進んだか実行履歴を追跡できます。ここでは,実行履歴を追跡するために必要な情報(ID)について説明します。
(a) クライアント相関ID
クライアント相関IDは,サービス部品呼び出しを要求するサービスリクエスタ側のプログラムで,要求時に設定する情報です。サービスリクエスタからの要求電文と,HCSCサーバで管理しているログおよびトレースとを対応づけるために使用します。そのため,HCSCサーバに送信した要求ごとに異なるIDを指定することを推奨します。IDはサービスリクエスタ開発時に指定します。クライアント相関IDが引き継がれる範囲を次の図に示します。
(b) メッセージ共通ID
HCSCサーバが付与するIDです。HCSCサーバ内のログやトレースを識別するために使用します。メッセージ共通IDが引き継がれる範囲を次の図に示します。
(c) JMSMessageID
Reliable Messagingが付与するIDです。HCSCサーバ内のログやトレースに出力します。JMSMessageIDが引き継がれる範囲を次の図に示します。
(d) JMSCorrelationIDおよびユーザ固有のJMSプロパティ
サービス部品の呼び出し要求時に,サービスリクエスタにJMSCorrelationIDおよびユーザ固有のJMSプロパティを設定すると,その値がサービス部品側のキューまで引き継がれます。サービス部品側のプログラムで取得することで,メッセージを一意に関連づけられます。JMSCorrelationIDおよびユーザ固有のJMSプロパティが引き継がれる範囲を次の図に示します。
(e) スレッドID
J2EEコンテナによって処理するスレッドごとに与えられるIDです。スレッドIDが引き継がれる範囲を次の図に示します。