0

私は、5分間待機し、システムがまだ回復されていない場合にアラートを発する回復モニターに取り組んでいます。モニターは起動時に起動し、アラートを1回だけ起動する必要があります。ソースコードは次のようになります。

@Stateless
public class RecoveryMonitor {
    @Inject TimerService timerService;
    @Inject MyAlertService alertService;
    @Inject SystemRecovery systemRecovery;

    public void scheduleMonitor() {
        timerService.createSingleActionTimer(TimeUnit.MINUTES.toMillis(5),
            new TimerConfig);
    }

    @Timeout
    public void timeout() {
        if (!systemRecovery.isDone) {
            alertService.alert("System recovery failed");
        }
    }
}

したがって、ここでの問題は、タスクをスケジュールする方法、つまり、scheduleMonitorメソッドを呼び出す方法です。@PostConstructは許可されていないため、使用できません。@Scheduleの使用を考えていますが、メソッドを定期的に実行し、1回だけ実行します。任意の解決策および/または提案を歓迎します。ありがとう。

L

更新:クラスをステートレスではなくすることで、たとえば@Singletonにすることで、@PostConstructを使用してスケジューリングを開始できます。これは完全な解決策ではありませんが、私にとってはうまくいきます。

@Singleton
public class RecoveryMonitor {
    @Inject TimerService timerService;
    @Inject MyAlertService alertService;
    @Inject SystemRecovery systemRecovery;

    @PostConstruct
    public void scheduleMonitor() {
        timerService.createSingleActionTimer(TimeUnit.MINUTES.toMillis(5),
            new TimerConfig);
    }

    @Timeout
    public void timeout() {
        if (!systemRecovery.isDone) {
            alertService.alert("System recovery failed");
        }
    }
}
4

1 に答える 1

0

サーブレット環境がある場合、ServletContextListener 内で CDI イベント (ApplicationStartedEvent など) を起動し、EJB でそのイベントを観察できます。この種の起動ロジックは、CDI 1.0 で手動で行う必要があります。将来のバージョンには、おそらく同様のものが含まれるでしょう。

それを行う方法について質問がある場合は、質問してください:)

于 2013-03-03T15:09:24.730 に答える