EJB 3.0 タイマーを実装する必要があり、次のアプローチを採用しました。
- @Stateless Bean を作成し、TimerService に @Resource アノテーションを注入しました
- 起動時に初期化メソッドを呼び出すサーブレットを実装しました
次のスニペットは、より明確な全体像を提供できるはずです。
タイマーの実装:
public class TimerFacade {
@Resource
protected TimerService timerService;
public void createTimer() {
timerService.createTimer(startTime, intervall, ident);
}
}
初期サーブレット:
public class InitServlet extends HttpServlet {
@EJB
private transient ITimerFacade timerFacade;
@Override
public void init(final ServletConfig config) throws ServletException {
timerFacade.createTimer();
}
}
(再)展開後、すべて問題ありません。しかし、再起動後、glassfish (2.1) から次のメッセージが表示されます。
Rescheduling missed expiration for periodic timer ...
この動作をどのように回避し、タイマーが一度だけ開始されることをどのように保証できますか?
現在利用可能なタイマーを提供できるように、タイマー サービスが注入されたステートレス Bean を作成する必要があります。ただし、コンテナから再スケジュールされるタイマーはこのリストに表示されません。これは、コンテナがアプリ全体の初期化の最後に永続化されたタイマーを再スケジュールするためです。