首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将任务安排为只运行一次

将任务安排为只运行一次
EN

Stack Overflow用户
提问于 2013-01-29 11:35:08
回答 1查看 2.3K关注 0票数 0

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

代码语言:javascript
复制
@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开始调度。这不是一个完整的解决方案,但对我来说是有效的:

代码语言:javascript
复制
@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");
        }
    }
}
EN

回答 1

Stack Overflow用户

发布于 2013-03-03 15:09:24

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

如果你对如何做到这一点有疑问,只需问:)

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14581961

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档