Schedule
★Timer種類
single-eventタイマ
1回だけ実行
createTimer(long duration, Serializable info)
createTimer(Date expiration, Serializable info)
createSingleActionTimer
intervalタイマ
一定間隔で繰り返し実行
createTimer(long initialDuration, long intervalDuration, Serializable info)
createTimer(Date initialExpiration, long intervalDuration, Serializable info)
createIntervalTimer
calendar-basedタイマ
カレンダー形式で指定した日時に実行
createCalendarTimer
★TimerService
・Stateful Beanで使用できない(デプロイ失敗)
・分・秒単位の繰り返しを設定する場合、hourにワイルドカード * を指定する必要がある
TimerServiceが指定できるのは、ステートレスBean・シングルトン・MDB
・永続的なタイマ(デフォルト) サーバーがシャットダウンしても、情報が保持される
・非永続的なタイマ サーバーがシャットダウンしたら、前回の情報は引き継がない
TimerService取得
import javax.ejb.TimerService;
import javax.ejb.EJBContext;
import javax.ejb.SessionContext;
// 方法1
@Resource
private TimerService timerService;
// 方法2
@Resource
EJBContext context;
TimerService timerService = context.getTimerService();
// 方法3
@Resource
SessionContext context;
TimerService timerService = context.getTimerService();
書き方1
@Singleton
@Startup
public class ScheduledEjb {
@Schedule(second = "*/10", minute = "*", hour = "*", persistent = false)
public void process() {
...
}
}
書き方2
@Singleton
@Startup
public class ScheduledEjb {
@Resource
private TimerService timer;
@PostConstruct
public void registerTimer() {
ScheduleExpression schedule =
new ScheduleExpression().hour("*").minute("*").second("*/10");
timer.createCalendarTimer(schedule, new TimerConfig(null, false));
}
@Timeout
private void timeout() {
...
}
}
サンプル
import javax.ejb.Lock;
import javax.ejb.LockType;
@Singleton
@Lock(LockType.WRITE) // By default
public class ChatRoom {
private Map<User, Collection<String>> userComments;
private final AtomicInteger checks = new AtomicInteger();
@PostConstruct
public void setup(){
userComments = new ConcurrentHashMap<User, Collection<String>>();
}
public void join(User usr) { ... }
public void disconnect(User usr) { ... }
public void say(String msg) { ... }
@Lock(LockType.READ) // Allows to execute in parallel
public int getCountOfActiveUsers() { ... }
@Schedule(minute="1", hour="*")
public void cleanUpOldData() { ... }
@Schedule(hour="*/8")
private void checkOn() {
checks.incrementAndGet();
}
public int getChecks() {
return checks.get();
}
}