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()で作成したタイマーの時間が来ると処理が行われます。