5.3.8 実装時の注意事項
ここでは,メソッドタイムアウト機能,およびメソッドキャンセル機能を実装する場合の設定や注意事項について説明します。
- 〈この項の構成〉
(1) Webアプリケーションのリクエスト処理でのタイムアウト値の設定方法
Webアプリケーションのリクエスト処理では,次の表に示すメソッドにタイムアウト値を設定できます。各メソッドのタイムアウト値の有効範囲については,「5.3.5 タイムアウト値の設定例と設定値の有効範囲」を参照してください。
なお,タイムアウトを利用するサーブレットおよびJSPは,DD(web.xml)の<servlet>タグで定義します。
javax.servlet.http.HttpServletクラスのサブクラスとしてサーブレットを実装し,javax.servlet.http.HttpServletクラスのserviceメソッドから呼び出されるdoXXXメソッド(doGetメソッド,doPostメソッドなど)をオーバーライドする場合,オーバーライドしたdoXXXメソッドがタイムアウトの適用対象となります。
JSPのserviceメソッドとは,JSPから生成されたjavax.servlet.jsp.JspPageインタフェースを実装したクラスのserviceメソッドを指します。
JSP内に定義する_jspServiceメソッドは,JspPageインタフェースの実装クラスから,JspPageのserviceメソッドの延長で実行されます。JSPでJspPageを指定しない場合,Webコンテナが提供するJspPageインタフェースの実装クラスが使用されます。
(2) Enterprise Beanのメソッド呼び出し処理でのタイムアウト値の設定方法
Enterprise Beanのメソッド呼び出し処理では,メソッド単位にタイムアウト値を設定できます。Enterprise Bean単位にタイムアウト値を設定できません。
J2EEアプリケーションのメソッドを呼び出す側でのメソッドタイムアウト適用対象メソッドを表5-13に,J2EEアプリケーションに実装されるコールバックメソッド側でのメソッドタイムアウトの適用対象メソッドを表5-14にそれぞれ示します。
CMP2.0のfindメソッド/selectメソッド,およびCMP1.0のfindメソッドのように,Javaプログラムに実装されていないメソッドは,メソッドタイムアウトの適用対象外となります。また,メソッドが呼び出しされたときの状態によって,呼び出されるかどうかが決定するコールバックメソッド(ejbActivate,ejbLoadなど)についても,適用対象外となります。
(3) メソッドタイムアウト発生時のオプションメッセージの設定
メソッドタイムアウトが発生した場合,オプションを設定しておくことによって,タイムアウトを通知するメッセージの詳細部分に任意の文字列を追加することができます。実装例を次に示します。
// ユーザの処理 .... // メッセージの追加 RequestMonitorMessage.setMessage("メッセージを追加します。"); .... // ユーザの処理
次のような監視対象ではないアプリケーションでは,このメソッドは使用できません。
-
EJBクライアントアプリケーション
-
J2EEアプリケーションが生成,起動したスレッドで動作するアプリケーション
(4) メソッドキャンセルを利用するアプリケーション開発時の注意事項
メソッドキャンセルを使用する場合,アプリケーションを開発するときに,アプリケーションのデータ構造について注意する必要があります。
メソッドキャンセルを実行すると,スレッドの実行が予期しない場所で中断されます。そのため,メソッドキャンセルの対象スレッドとほかのスレッドで,更新または削除を実行する共有データがある場合,メソッドキャンセルを使用しないでください。共有データが破壊され,ほかのリクエストの処理に影響を及ぼすことがあります。
例えば,あるEnterprise Beanに共有の領域(変数A=1,B=2)を設けて,複数スレッド(スレッド1とスレッド2)でアクセスした場合に,スレッド1が共有の領域を更新中(A=10,B=20)にThreadDeath例外が発生すると,更新が中途半端のまま(A=10,B=2)スレッド1が終了します。このとき,スレッド1が更新途中のデータをスレッド2で参照して,A*Bを計算すると,演算結果が不正になります(正:200,誤:20)。そのため,このような例では,メソッドキャンセルは使用できません。
また,ローカル呼び出し最適化機能を使用している場合は,アプリケーション内で,またはアプリケーションをわたって,複数スレッドで更新や削除を実行するようなデータ構造がないか確認する必要もあります。