@スケジュール
EJB 3.1 (glassfish 3.x) を使用している場合は、@Schedule アノテーションを使用して、コンテナが指定された間隔で、または指定されたカレンダー時刻にメソッドを呼び出すようにすることができます。独自のコードでスレッドの処理を回避できるようにする
EJB 3.1 タイマーについて読む
@Stateless
public class LabbBean {
@EJB
WorkerEjb workerEjb;
@Schedule(second="*/5", minute="*",hour="*", persistent=false)
public void myMethod() {
for (all jobs found in db){
workerEjb.workerMethod(job);
}
}
}
@Stateless
public class WorkerEjb {
@Asynchronous
public void workerMethod(job) {
//Send emails
}
}
別々のスレッドで作業を行いたい場合、@Schedule アノテーション付きメソッドは、@Asynchronous アノテーションが付けられた worker-method を使用して worker-ejb を呼び出すことができます。
@タイムアウト
データベースからスケジュールを開始する必要があることに気付きました。@Singleton ejb と @Startup アノテーションを使用して、一連のタイマーをプログラムで開始するオプションがあります。タイムアウト アノテーション付きメソッドは、いくつかのタイマーが同時に実行された場合、別のスレッドで呼び出されます。
@Singleton
@Startup
public class LabbBean {
@Resource
protected TimerService timerService;
@PostConstruct
public void init() {
//Init your timers from the data in the database here
for (all your timers) {
TimerConfig config = new TimerConfig();
config.setInfo("timer1");
config.setPersistent(false);
ScheduleExpression schedule = new ScheduleExpression();
schedule.dayOfMonth(10);
schedule.minute(2);
timerService.createCalendarTimer(schedule, config);
}
}
//method called when timeout occurs
@Timeout
public void timeoutHandler(Timer timer) {
String name = timer.getInfo().toString();
System.out.println("Timer name=" + name);
}
}