Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/svg/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 将任务计划为仅运行一次_Java_Jakarta Ee_Scheduled Tasks_Java Ee 6 - Fatal编程技术网

Java 将任务计划为仅运行一次

Java 将任务计划为仅运行一次,java,jakarta-ee,scheduled-tasks,java-ee-6,Java,Jakarta Ee,Scheduled Tasks,Java Ee 6,我正在使用一个恢复监视器,它会等待5分钟,如果系统尚未恢复,就会发出警报。监视器需要在启动时启动,并且只需发出一次火灾警报。源代码如下所示: @Stateless public class RecoveryMonitor { @Inject TimerService timerService; @Inject MyAlertService alertService; @Inject SystemRecovery systemRecovery; public vo

我正在使用一个恢复监视器,它会等待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,但它会定期执行一个方法,而我只需要执行一次。欢迎提出任何解决方案和/或建议。谢谢

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");
        }
    }
}

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


如果您对如何做有疑问,只需询问:)

您可以使用
@Startup
注释
@Singleton
bean,以在容器启动时获得急切的初始化。