0

我正在开发一个恢复监视器,它会等待 5 分钟,如果系统尚未恢复,则会发出警报。显示器需要在启动时启动并且只触发一次警报。源代码如下所示:

@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,但它会定期执行一个方法,而我只执行一次。欢迎任何解决方案和/或建议。谢谢。

大号

更新:通过使该类不再是无状态的,例如使其成为@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

如果您有一个 Servlet 环境,您可以在 ServletContextListener 中触发一个 CDI 事件(例如 ApplicationStartedEvent)并在您的 EJB 中观察该事件。这种启动逻辑必须在 CDI 1.0 中手动完成。未来的版本可能会包含类似的内容。

如果您对如何做到这一点有疑问,请询问:)

于 2013-03-03T15:09:24.730 回答