2.12.7 Timer Serviceを使用するアプリケーションの実装
Timer Serviceを使用する場合のアプリケーションの実装内容として,APIを使用した実装と,アノテーションを使用した実装について説明します。また,カレンダー形式でスケジュールを指定する場合の指定方法についても説明します。
(1) APIを使用した実装内容
次の内容を実装します。
-
タイムアウトメソッドの指定
次に示すどちらかの方法で,コールバックするタイムアウトメソッドを指定します。
-
タイムアウトメソッドとして利用するメソッドに,Timeoutアノテーションを指定します
-
Enterprise BeanにTimedObjectインタフェースを実装します。この場合,TimedObjectインタフェースで定義されているejbTimeoutメソッドがタイムアウトメソッドとなります。
-
-
javax.ejb.TimerServiceオブジェクトの取得
DIやEJBContextインタフェースのgetTimerServiceメソッドや,JNDIのlookupメソッドなどを使用して,TimerServiceオブジェクトを取得します。
-
EJBタイマ(Timer)の生成
TimerServiceオブジェクトの次のどれかのメソッドを呼び出し,Timerを生成するコードを実装します。
-
createTimer()
-
createSingleActionTimer()
-
createIntervalTimer()
-
createCalenderTimer()
-
-
EJBタイマ(Timer)のキャンセル
キャンセルする処理が必要な場合は,Timerをキャンセルするコードを実装します。Timerは,javax.ejb.TimerServiceやjavax.ejb.TimerHandleから取得します。
これらの処理を実装した例と,実装時の注意事項を示します。
(a) 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(); } } }
(b) 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; } }
(c) 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 "); } }
(2) アノテーションを利用した実装内容
@Scheduleアノテーションを使用して,タイマを自動生成できます。
例を示します。
(a) @Scheduleアノテーションの指定例
@Scheduleアノテーションを指定する例を示します。この例では,一つのタイマを生成します。
// @Scheduleアノテーションで毎月1日1時に // generateMonthlyAccountStatementsメソッドを実行する設定の例です。 @Schedule(hour="1", dayOfMonth="1",info="AccountStatementTimer") public void generateMonthlyAccountStatements() { ... }
@Scheduleアノテーションのinfo属性には,任意の文字列を指定します。指定された文字列は,関連するTimerオブジェクトのgetInfoメソッドで取得できます。
(b) @Schedulesアノテーションの指定例
@Schedulesアノテーションを指定する例を示します。この例では,複数のタイマを生成します。
// @Schedulesアノテーションで月曜日〜木曜日の12時と // 金曜日の11時にsendLunchNotificationメソッドを実行する設定の例です。 @Schedules ( { @Schedule(hour="12", dayOfWeek="Mon-Thu"), @Schedule(hour="11", dayOfWeek="Fri") } ) public void sendLunchNotification() { ... }
@Schedulesアノテーションを使用することで,複数のタイマが一つのコールバックメソッドから呼び出されます。
(3) カレンダー形式でスケジュールを指定する場合の指定方法
カレンダー形式のコーディングでは次のように値を使用します。
なお,指定できる値などは,標準仕様に準拠しています。
-
一つの値の指定
秒(second)や月(month)などで,一つの値を指定する場合は,次のように指定します。
-
例
second = "10"
month = "Sep"
-
-
ワイルドカード
次のようにワイルドカードを指定できます。
-
例
second = "*"
dayOfWeek = "*"
-
-
複数指定
「,」を使用することで,複数の値を指定できます。
-
例
second = "10,20,30"
dayOfWeek = "Mon,Wed,Fri"
minute = "0-10,30,40"
-
-
範囲指定
「-」を使用することで,一定期間の値を指定できます。
-
例
second="1-10"
dayOfWeek = "Sat-Mon"
また,次に示す例は,ある月の27日から次の月の3日までを表します。最初の「-」は,開始時と終了時の間隔を表します。
-
例
dayOfMonth = "27-3"
この例では日にちに関する指定ですが,ある時間の秒(second),分(minutes),または時間(Hours)の場合も同じように指定できます。
-
-
増分指定
「/」を使用することで,増分を指定できます。増分として指定した値が増えるごとに,処理が実行されます。
次に示す例は,5分ごとに実行することを表します。
-
例
minute = "*/5"
この例は,「minute = "0,5,10,15,20,25,30,35,40,45,50,55"」と指定する場合と同じです。
また,次に示す例は,毎分30秒から10秒ごとに実行することを表します。
-
例
second = "30/10"
この例は,「second = "30,40,50, ..."」と指定する場合と同じです。
- 注意事項
-
createCalendarTimerメソッドの引数が不正な場合,IllegalArgumentException例外がスローされ,KDJE43209-Eが出力されます。
-