8.6.7 J2EEアプリケーションのメソッドタイムアウトを設定する
ここでは,J2EEアプリケーションのメソッドタイムアウトの設定について説明します。メソッドタイムアウトを設定することによって,ポイント6とポイント9で,WebコンテナまたはEJBコンテナ上の業務処理での無限ループが発生した場合などに,タイムアウトによって検知できるようになります。また,タイムアウトを検知したメソッドを強制的にキャンセル(メソッドキャンセル)することもできます。メソッドキャンセル機能の詳細については,マニュアル「アプリケーションサーバ 機能解説 運用/監視/連携編」の「5.3.2 J2EEアプリケーション実行時間の監視とは」を参照してください。
メソッドタイムアウトを設定する場合の考え方について説明します。
J2EEアプリケーション内でメソッドの呼び出しが入れ子になっている場合,タイムアウト値として,呼び出し元の方に大きな値を設定するように,メソッドの呼び出し順序を考慮して設定してください。
設定例を次に示します。
この例では,呼び出し元に近いメソッドに大きな値を設定しています。これによって,メソッドのどこかでタイムアウトが発生した場合,クライアントから遠いメソッドから順番にタイムアウトが発生します。タイムアウトはメッセージで通知されます。設定によっては,このタイミングでメソッドキャンセルを自動実行できます。
リモート呼び出しを実行するメソッドに対してメソッドタイムアウトおよびメソッドキャンセルを設定した場合は,呼び出し順序に注意してください。メソッドキャンセル機能では,リモート呼び出し中のメソッドは保護区で実行中と判断されます。呼び出し元に近いメソッドで先にタイムアウトが発生した場合,メソッドはリモート呼び出し中であるため,メソッドキャンセルができません。例のように呼び出し元に近い方に大きい値を設定しておけば,タイムアウトは呼び出し元から遠い順に発生するため,タイムアウトが発生したメソッドがリモート呼び出しをしていることはありません。このため,確実にメソッドキャンセルを実行できます。
ローカル呼び出しを実行するメソッドに対してメソッドタイムアウトおよびメソッドキャンセルをする設定をした場合も,呼び出し元から遠い順にキャンセルされるようにすることで,タイムアウトが発生したメソッドとキャンセルが実行されたメソッドを一致させることができます。
タイムアウト値を設定できるメソッドについては,マニュアル「アプリケーションサーバ 機能解説 運用/監視/連携編」の「5.3.4 メソッドキャンセルとは」を参照してください。
- ローカル呼び出しのメソッドを入れ子で呼び出している場合の注意
-
簡易構築定義ファイルの<param-name>タグに指定するejbserver.rmi.localinvocation.scopeにappまたはallを指定している場合,一つのメソッドから入れ子で呼び出されるローカル呼び出しのメソッドは,すべて同一スレッド上で実行されます。このとき,次の点に注意してください。
-
入れ子で呼び出されるメソッドのタイムアウトやメソッドキャンセルが失敗すると,そのメソッドが終了するまで同一スレッドのほかのメソッドではタイムアウトが発生しません。
-
タイムアウトが発生したメソッドから入れ子で呼び出されているメソッドに対してメソッドキャンセルを実行した場合,コンテナによってキャンセルされるのは,メソッドキャンセルを実行した対象のメソッドだけです。タイムアウトが発生した呼び出し元のメソッドは,キャンセルの対象にはなりません。このため,キャンセルを実行したあとも,通常入れ子のメソッドの呼び出す場合と同様に,順次呼び出されたメソッドが終了していきます。なお,それらの順次呼び出されるメソッドもタイムアウト監視の対象になります。
同一スレッド上でローカル呼び出しのメソッドを入れ子で呼び出している場合の注意を次の図に示します。
図8‒15 同一スレッド上でローカル呼び出しのメソッドを入れ子で呼び出している場合の注意 -