EJB3.1でプログラムでタイマーを作成し実行してみる
10秒毎にサーバ非起動中の実行しなかったものは破棄する形で実行するサンプル。
@PostConstructのついたメソッドでインスタンス化時にTimerを作ったら
そのTimerのタイムアウトで@Timeoutのついたメソッドが呼ばれます。
※timerService.createCalendarTimerでTimerを複数作れば複数のタイマー処理が
実行されます。複数のTimerを扱う場合は@Timeoutのついたメソッド内で
timer.getInfo()で処理を判別するといいかと思われます。
package jp.techie.plain.sample.service.schedule; import javax.annotation.PostConstruct; import javax.annotation.Resource; import javax.ejb.Lock; import javax.ejb.LockType; import javax.ejb.ScheduleExpression; import javax.ejb.Singleton; import javax.ejb.Startup; import javax.ejb.Timeout; import javax.ejb.Timer; import javax.ejb.TimerConfig; import javax.ejb.TimerService; import jp.techie.plain.framework.util.LogUtil; @Singleton @Lock(LockType.READ) @Startup public class SampleSchedule { private static LogUtil logUtil = new LogUtil(SampleSchedule.class); @Resource public TimerService timerService; @PostConstruct public void postConstruct() { ScheduleExpression scheduleExpression = new ScheduleExpression(); scheduleExpression.second("*/10"); scheduleExpression.minute("*"); scheduleExpression.hour("*"); scheduleExpression.dayOfMonth("*"); scheduleExpression.month("*"); scheduleExpression.year("*"); scheduleExpression.dayOfWeek("*"); TimerConfig timerConfig = new TimerConfig("sampleTimer", false); timerService.createCalendarTimer(scheduleExpression, timerConfig); } @Timeout public void executeTimer(Timer timer) { logUtil.info("postConstruct()で作成したタイマーの時間が来ると処理が行われます。"); } }
11:28:00,002 INFO [jp.techie.plain.sample.service.schedule.SampleSchedule] (EJB default - 6) Line:45 postConstruct()で作成したタイマーの時間が来ると処理が行われます。 11:28:10,002 INFO [jp.techie.plain.sample.service.schedule.SampleSchedule] (EJB default - 8) Line:45 postConstruct()で作成したタイマーの時間が来ると処理が行われます。 11:28:20,003 INFO [jp.techie.plain.sample.service.schedule.SampleSchedule] (EJB default - 10) Line:45 postConstruct()で作成したタイマーの時間が来ると処理が行われます。 11:28:30,002 INFO [jp.techie.plain.sample.service.schedule.SampleSchedule] (EJB default - 7) Line:45 postConstruct()で作成したタイマーの時間が来ると処理が行われます。 11:28:40,002 INFO [jp.techie.plain.sample.service.schedule.SampleSchedule] (EJB default - 9) Line:45 postConstruct()で作成したタイマーの時間が来ると処理が行われます。 11:28:50,001 INFO [jp.techie.plain.sample.service.schedule.SampleSchedule] (EJB default - 2) Line:45 postConstruct()で作成したタイマーの時間が来ると処理が行われます。