0

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 を作成する必要があります。ただし、コンテナから再スケジュールされるタイマーはこのリストに表示されません。これは、コンテナがアプリ全体の初期化の最後に永続化されたタイマーを再スケジュールするためです。

4

2 に答える 2

1

EJBタイマーは永続的です。つまり、タイマーをキャンセルしなかった場合、サーバーが起動するとタイマーは引き続き機能します。

アプリケーションがシャットダウンしているとき(Glassfishでどのように行うかわからない)、または新しいタイマーを作成する前に、タイマーをキャンセルする必要があります。そのタイマーがすでに存在するかどうかを確認してください。

于 2012-07-26T10:10:16.213 に答える
0

私は同様の問題を抱えていました.... ObjectTimerが一度に1つずつ実行されるようにするために、@Timeoutメソッドで使用する静的ブール変数ENABLE_TIMERである一種のセマフォを使用しました。

@Timeout
public void timerMethod(Timer timer) {
    try{
    if (ObjectModelSessionBean.ENABLE_TIMER ) {
        timerMethod();
    } else {
        LOGGER.info("timer is temporary disabled - waiting....);
    }
    }catch (Exception ex){
         LOGGER.severe("- Eccezione.   "+ex.toString());
    }
}

timerMethod() の開始時に変数 ENABLE_TIMER を false に設定し、最後に ENABLE_TIMER を true に設定します

于 2014-12-23T08:51:26.867 に答える