Hitachi

Cosminexus V11 アプリケーションサーバ 機能解説 運用/監視/連携編


5.3.8 実装時の注意事項

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

〈この項の構成〉

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

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

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

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

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

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

インタフェース

メソッド

Stateless

Session

Bean

Stateful

Session

Bean

Singleton

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

任意のメッセージリスナインタフェース(EJB 2.1以降)

任意のメッセージリスナメソッド

(凡例)

○:適用されます。

×:適用されません。

△:メソッドタイムアウトは適用されますが,メソッドキャンセルは適用されません。

−:該当しません。

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

メソッド

Stateless

Session

Bean

Stateful

Session

Bean

Singleton

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>

@PostConstruct

×

@PreDestroy

×

homeメソッド

ビジネスメソッド

onMessage

任意のメッセージリスナメソッド(EJB 2.1以降)

(凡例)

○:適用されます。

×:適用されません。

△:メソッドタイムアウトは適用されますが,メソッドキャンセルは適用されません。

−:該当しません。

注※

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

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

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