Cosminexus 機能解説
Timer Serviceを使用する場合のアプリケーションの実装内容を示します。
これらの処理を実装した例と,実装時の注意事項を示します。
アノテーションを使用した場合の実装例を示します。この例では,Timeoutアノテーション(@Timeout)でタイムアウトメソッド(myTimeout)を指定しています。
@Stateless public class TimerSessionBean{ @Resource TimerService timerService; public void createMyTimer(long intervalDuration){ Timer timer = timerService.createTimer (intervalDuration, "MyTimer"); } @Timeout public void myTimeout(Timer timer) { System.out.println("TimerSessionBean: myTimeout "); } public void cancelTimers(){ Collection<Timer> timers = timerService.getTimers(); for(Timer timer: timers) { timer.cancel(); } } } |
EJBContextのサブクラスであるSessionContextを利用して,TimerServiceオブジェクトを取得する例を示します。この例では,TimedObjectインタフェースをインプリメントして実装しています。
public class TimerSessionBean implements SessionBean, TimedObject{ private SessionContext context; public void createMyTimer(long intervalDuration) { System.out.println("TimerSessionBean: start createTimer "); TimerService timerService = context.getTimerService(); Timer timer = timerService.createTimer (intervalDuration, "MyTimer"); } public void ejbTimeout(Timer timer) { System.out.println("TimerSessionBean: ejbTimeout "); } public void setSessionContext(SessionContext sc) { context = sc; } } |
JNDIを使用して,TimerServiceオブジェクトを取得する例を示します。この例では,TimedObjectインタフェースをインプリメントして実装しています。
public class TimerSessionBean implements SessionBean, TimedObject{ private SessionContext context; public void createMyTimer(long intervalDuration) { System.out.println("TimerSessionBean: start createTimer "); InitialContext context = new InitialContext(); TimerService timerService = (TimerService)context.lookup("java:comp/TimerService"); Timer timer = timerService.createTimer (intervalDuration, "MyTimer"); } public void ejbTimeout(Timer timer){ System.out.println("TimerSessionBean: ejbTimeout "); } } |
Timer Serviceを実装するときの注意事項を示します。
TimerオブジェクトのgetInfoメソッドは,TimerServiceオブジェクトのcreateTimerメソッドで引数infoに指定されたオブジェクト自体を戻り値とします。そのため,getInfoメソッドの戻り値がcreateTimerメソッド実行時のオブジェクトと異なる状態である場合があり,トラブルが生じやすくなっています。
これを防ぐために,createTimerメソッドで引数infoに指定するオブジェクトはStringやIntegerなどの不変オブジェクトにする,または引数infoに指定したオブジェクトの状態を変更しないことを推奨します。変更した場合には,getInfoメソッドの戻り値は変更後のオブジェクトになります。
DDや属性ファイルで<method>タグにタイムアウトメソッドを指定する場合は,次のどちらかとしてください。
Timer Serviceをサポートしない取得手段を次の表に示します。Timer Serviceをサポートしない種別のBeanやサーブレットからTimerServiceオブジェクトを取得しようとした場合,手段によって次のような動作をします。
表5-23 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のCosminexusでの動作仕様を示します。
表5-24 Beanからjavax.ejb.TimerServiceのAPIを利用したときの動作
タイムアウトメソッドの実装 | javax.ejb.TimerServiceのメソッドの種類 | |
---|---|---|
createTimer | getTimers | |
実装している場合※ | EJBタイマ生成処理を実行します。 | EJBタイマのコレクションを返します。 |
実装していない場合 | IllegalStateException例外をスローします。 | 空のコレクションを返します。 |
表5-25 javax.ejb.TimerのAPIを利用したときの動作
タイムアウトメソッドの実行 | javax.ejb.Timerのメソッドの種類 | |||
---|---|---|---|---|
cancel | getHandle, getInfo | getNextTimeout | getTimeRemaining | |
実行していない場合※ | 「5.10.4 EJBタイマとコールバックの動作についての注意事項」を参照してください。 | 仕様どおりに動作します。 | 次のタイムアウトが起こる時刻を返します。 | 次のタイムアウトまでの時間を返します。 |
実行している場合 | 実行中のタイムアウトの開始予定時刻として登録されていた時刻を返します。 | 0を返します。 |
All Rights Reserved. Copyright (C) 2006, 2007, Hitachi, Ltd.