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

}

}