我正在处理一个恢复监视器,它等待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,但是它定期执行一个方法,而我只执行一次。欢迎任何解决方案和/或建议。谢谢。
我
UPDATE:通过使类不再是无状态的,例如使其成为@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");
}
}
}发布于 2013-03-03 15:09:24
如果您有一个Servlet环境,您可以在一个ApplicationStartedEvent中触发一个CDI事件(例如ApplicationStartedEvent),并在您的EJB中观察该事件。这种启动逻辑必须在CDI1.0中手动完成。未来的版本可能会包含类似的内容。
如果你对如何做到这一点有疑问,只需问:)
https://stackoverflow.com/questions/14581961
复制相似问题