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