安排任务只运行一次

时间:2013-01-29 11:35:09

标签: java java-ee scheduled-tasks java-ee-6

我正在使用一个等待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");
        }
    }
}

1 个答案:

答案 0 :(得分:0)

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

如果您对如何操作有疑问,请询问:)