Cosminexus 機能解説

[目次][用語][索引][前へ][次へ]

5.10.5 Timer Serviceを使用するアプリケーションの実装

Timer Serviceを使用する場合のアプリケーションの実装内容を示します。

これらの処理を実装した例と,実装時の注意事項を示します。

<この項の構成>
(1) DIを使用した場合の実装例(タイムアウトメソッドをTimeoutアノテーションで指定)
(2) EJBContextを利用した場合の実装例(TimedObjectインタフェースを実装)
(3) lookupを利用した場合の実装例(TimedObjectインタフェースを実装)
(4) Timer Service実装時の注意事項

(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 ");
  }
}

(4) Timer Service実装時の注意事項

Timer Serviceを実装するときの注意事項を示します。

(a) createTimerメソッドの引数infoの指定

TimerオブジェクトのgetInfoメソッドは,TimerServiceオブジェクトのcreateTimerメソッドで引数infoに指定されたオブジェクト自体を戻り値とします。そのため,getInfoメソッドの戻り値がcreateTimerメソッド実行時のオブジェクトと異なる状態である場合があり,トラブルが生じやすくなっています。

これを防ぐために,createTimerメソッドで引数infoに指定するオブジェクトはStringやIntegerなどの不変オブジェクトにする,または引数infoに指定したオブジェクトの状態を変更しないことを推奨します。変更した場合には,getInfoメソッドの戻り値は変更後のオブジェクトになります。

(b) DDおよび属性ファイルでのタイムアウトメソッド指定

DDや属性ファイルで<method>タグにタイムアウトメソッドを指定する場合は,次のどちらかとしてください。

(c) Timer Serviceオブジェクトをサポートしていない種別のBeanからTimer Serviceオブジェクトを取得しようとした場合の動作

Timer Serviceをサポートしない取得手段を次の表に示します。Timer Serviceをサポートしない種別のBeanやサーブレットからTimerServiceオブジェクトを取得しようとした場合,手段によって次のような動作をします。

表5-23 Timer Serviceオブジェクトをサポートしていない種別のBeanからTimer Serviceオブジェクトを取得しようとした場合の動作

TimerServiceオブジェクトの取得手段 動作
EJBContext#getTimerService IllegalStateException例外をスローします。
JNDIのルックアップ NamingException例外をスローします。
DI デプロイに失敗します。

Timer Serviceをサポートしている種別のBeanは,タイムアウトメソッドを実装しているかどうかに関係なく,TimerServiceオブジェクトを取得できます。

(d) TimerServiceが提供するAPIの動作仕様

TimerServiceが提供するAPIを呼び出したときの動作のうち,EJB仕様書で明確に示されていない動作仕様があります。ここでは,javax.ejb.TimerServiceおよびjavax.ejb.TimerのCosminexusでの動作仕様を示します。