2.12.8 Timer Service実装時の注意事項
Timer Serviceを実装するときの注意事項を示します。
- 〈この項の構成〉
(1) createTimerメソッドの引数infoの指定
TimerオブジェクトのgetInfoメソッドは,TimerServiceオブジェクトのcreateTimerメソッドの引数infoまたはTimerConfigオブジェクトのコンストラクタメソッドの引数infoに指定されたオブジェクト自体を戻り値とします。そのため,getInfoメソッドの戻り値がcreateTimerメソッドなどの実行時のオブジェクトと異なる状態である場合があり,トラブルが生じやすくなっています。
これを防ぐために,createTimerメソッドで引数infoに指定するオブジェクトはStringやIntegerなどの不変オブジェクトにする,または引数infoに指定したオブジェクトの状態を変更しないことを推奨します。変更した場合には,getInfoメソッドの戻り値は変更後のオブジェクトになります。
(2) DDおよび属性ファイルでのタイムアウトメソッド指定
DDや属性ファイルで<method>タグにタイムアウトメソッドを指定する場合は,次のどちらかとしてください。
-
<method>タグ直下に<method-intf>タグの定義を追加しない。
-
<method-intf>タグの要素を空にする。
(3) Timer Serviceオブジェクトをサポートしていない種別のBeanからTimer Serviceオブジェクトを取得しようとした場合の動作
Timer Serviceをサポートしない取得手段を次の表に示します。Timer Serviceをサポートしない種別のBeanやサーブレットからTimerServiceオブジェクトを取得しようとした場合,手段によって次のような動作をします。
TimerServiceオブジェクトの取得手段 |
動作 |
---|---|
EJBContext#getTimerService |
IllegalStateExceptionをスローします。 |
JNDIのルックアップ |
NamingExceptionをスローします。 |
DI |
デプロイに失敗します。 |
Timer Serviceをサポートしている種別のBeanは,タイムアウトメソッドを実装しているかどうかに関係なく,TimerServiceオブジェクトを取得できます。
(4) TimerServiceが提供するAPIの動作仕様
TimerServiceが提供するAPIを呼び出したときの動作のうち,EJB仕様書で明確に示されていない動作仕様があります。ここでは,javax.ejb.TimerServiceおよびjavax.ejb.Timerのアプリケーションサーバでの動作仕様を示します。
-
javax.ejb.TimerService
javax.ejb.TimerServiceのメソッドを呼び出したBeanがタイムアウトメソッドを実装している場合,およびタイムアウトメソッドを実装していないときの動作を,次の表に示します。
表2‒36 Beanからjavax.ejb.TimerServiceのAPIを利用したときの動作 タイムアウトメソッドの実装
javax.ejb.TimerServiceのメソッドの種類
createTimer,
createCalendarTimer,
createIntervalTimer,
createSingleActionTimer
getTimers
実装している場合※
EJBタイマ生成処理を実行します。
EJBタイマのコレクションを返します。
実装していない場合
IllegalStateExceptionをスローします。
空のコレクションを返します。
-
javax.ejb.TimerのAPI
タイムアウトメソッドが実行している場合,および実行していない場合に,javax.ejb.Timerに対してメソッドを呼び出したときの動作を,次の表に示します。
表2‒37 javax.ejb.TimerのAPIを利用したときの動作 タイムアウトメソッドの実行
javax.ejb.Timerのメソッドの種類
cancel
getHandle,getInfo,isCalendarTimer,getSchedule
getNextTimeout
getTimeRemaining
isPersistent
実行していない場合※
「2.12.6 EJBタイマとコールバックの動作」を参照してください。
仕様どおりに動作します。
次のタイムアウトが起こる時刻を返します。
次のタイムアウトまでの時間を返します。
EJBタイマの永続性はサポートしていないため,常にfalseを返します。
実行している場合
実行中のタイムアウトの開始予定時刻として登録されていた時刻を返します。
0を返します。
- 参考
-
アプリケーションサーバでは,Timer Serviceのサンプルプログラムを提供しています。サンプルプログラムの概要および実行方法については,マニュアル「アプリケーションサーバ システム構築・運用ガイド」の「付録L アプリケーションサーバが提供するサンプルプログラム」を参照してください。
(5) タイムアウトメソッド実装時の注意事項
-
タイムアウトメソッドは,次のどちらかの形式で実装してください。これらの形式で実装していない場合,アプリケーションの開始に失敗します。
-
void <メソッド名>()
-
void <メソッド名>(Timer timer)
-
-
タイムアウトメソッドでは,アプリケーション例外をスローしないでください。アプリケーション例外をスローする実装にした場合は,アプリケーションの開始に失敗します。
-
タイムアウトメソッドでは,finalまたはstaticを宣言しないでください。