2.12.8 Timer Serviceを使用するアプリケーションの実装
Timer Serviceを使用する場合のアプリケーションの実装内容を示します。
- タイムアウトメソッドの指定
次に示すどちらかの方法で,コールバックするタイムアウトメソッドを指定します。
- タイムアウトメソッドとして利用するメソッドに,Timeoutアノテーションを指定します
- Enterprise BeanにTimedObjectインタフェースを実装します。この場合,TimedObjectインタフェースで定義されているejbTimeoutメソッドがタイムアウトメソッドとなります。
- javax.ejb.TimerServiceオブジェクトの取得
DIやEJBContextインタフェースのgetTimerServiceメソッドや,JNDIのlookupメソッドなどを使用して,TimerServiceオブジェクトを取得します。
- EJBタイマ(Timer)の生成
TimerServiceオブジェクトのcreateTimerメソッドを呼び出し,Timerを生成するコードを実装します。
- EJBタイマ(Timer)のキャンセル
キャンセルする処理が必要な場合は,Timerをキャンセルするコードを実装します。Timerは,javax.ejb.TimerServiceやjavax.ejb.TimerHandleから取得します。
これらの処理を実装した例と,実装時の注意事項を示します。
- <この項の構成>
- (1) DIを使用した場合の実装例(タイムアウトメソッドをTimeoutアノテーションで指定)
- (2) EJBContextを利用した場合の実装例(TimedObjectインタフェースを実装)
- (3) lookupを利用した場合の実装例(TimedObjectインタフェースを実装)
(1) DIを使用した場合の実装例(タイムアウトメソッドをTimeoutアノテーションで指定)
アノテーションを使用した場合の実装例を示します。この例では,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();
}
}
} |
(2) EJBContextを利用した場合の実装例(TimedObjectインタフェースを実装)
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;
}
} |
(3) lookupを利用した場合の実装例(TimedObjectインタフェースを実装)
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 ");
}
} |