Cosminexus 機能解説

[目次][用語][索引][前へ][次へ]

19.3.5 J2EEアプリケーション実行時間の監視機能の実装

ここでは,メソッドタイムアウト機能,およびメソッドキャンセル機能を実装する場合の設定や注意事項について説明します。

<この項の構成>
(1) Webアプリケーションのリクエスト処理でのタイムアウト値の設定方法
(2) Enterprise Beanのメソッド呼び出し処理でのタイムアウト値の設定方法
(3) メソッドタイムアウト発生時のオプションメッセージの設定
(4) メソッドキャンセルを利用するアプリケーション開発時の注意事項

(1) Webアプリケーションのリクエスト処理でのタイムアウト値の設定方法

Webアプリケーションのリクエスト処理では,次の表に示すメソッドにタイムアウト値を設定できます。各メソッドのタイムアウト値の有効範囲については,「19.3.4 タイムアウト値の設定例と設定値の有効範囲」を参照してください。

なお,タイムアウトを利用するサーブレットおよびJSPは,DD(web.xml)の<servlet>タグで定義しておく必要があります。

表19-4 メソッドタイムアウトの適用対象(Webアプリケーションのリクエスト処理)

ケース メソッド 条件
サーブレット,JSP service 条件はありません。
init DD(web.xml)に<load-on-startup>タグを定義していないサーブレット(JSP利用時は,JSP)に対して,初回リクエストで実行される場合だけ,メソッドタイムアウトの適用対象となります。
destroy serviceメソッドを呼び出した時に,永久に利用できないことを示すjavax.servlet.UnavailableException例外をスローしたことで実行される場合だけ,メソッドタイムアウトの適用対象となります。
フィルタ doFilter 条件はありません。

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アプリケーションのメソッドを呼び出す側でのメソッドタイムアウト適用対象メソッドを表19-5に,J2EEアプリケーションに実装されるコールバックメソッド側でのメソッドタイムアウトの適用対象メソッドを表19-6にそれぞれ示します。

CMP2.0のfindメソッド/selectメソッド,およびCMP1.0のfindメソッドのように,Javaプログラムに実装されていないメソッドは,メソッドタイムアウトの適用対象外となります。また,メソッドが呼び出しされたときの状態によって,呼び出されるかどうかが決定するコールバックメソッド(ejbActivate,ejbLoadなど)についても,適用対象外となります。

表19-5 メソッドタイムアウトの適用対象(Enterprise Bean呼び出し側)

インタフェース メソッド Stateless
Session
Bean
Stateful
Session
Bean
Entity
Bean
(BMP)
Entity
Bean
(CMP2.0)
Entity
Bean
(CMP1.1)
Message
-driven
Bean
ホームインタフェース create × ×
finder × ×
select ×
home
コンポーネントインタフェース remove × ×
ビジネスメソッド
javax.jms.MessageListener onMessage

(凡例)○:適用されます。 ×:適用されません。 −:該当しません。


表19-6 メソッドタイムアウトの適用対象(コールバックメソッド側)

メソッド Stateless
Session
Bean
Stateful
Session
Bean
Entity
Bean
(BMP)
Entity
Bean
(CMP2.0)
Entity
Bean
(CMP1.1)
Message
-driven
Bean
コンストラクタ × × × × × ×
setSessionContext/setEntityContext/setMessageDrivenContext × × × × × ×
unsetSessionContext/unsetEntityContext × × × × ×
ejbCreate<Method> × ×
ejbPostCreate<Method> × × ×
ejbRemove × ×
ejbActivate × × × × ×
ejbPassivate × × × × ×
ejbLoad × × ×
ejbStore × × ×
ejbfind<Method>
ejbSelect<Method>
homeメソッド
ビジネスメソッド
onMessage

(凡例)○:適用されます。 ×:適用されません。 −:該当しません。

注※
タイムアウト機能などのコンテナの処理で呼び出された場合は対象外です。

(3) メソッドタイムアウト発生時のオプションメッセージの設定

メソッドタイムアウトが発生した場合,オプションを設定しておくことによって,タイムアウトを通知するメッセージの詳細部分に任意の文字列を追加することができます。実装例を次に示します。

    // ユーザの処理
....
    // メッセージの追加
RequestMonitorMessage.setMessage("メッセージを追加します。");
....
// ユーザの処理

次のような監視対象ではないアプリケーションでは,このメソッドは使用できません。

(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)。そのため,このような例では,メソッドキャンセルは使用できません。

また,ローカル呼び出し最適化機能を使用している場合は,アプリケーション内で,またはアプリケーションをわたって,複数スレッドで更新や削除を実行するようなデータ構造がないか確認する必要もあります。