在 EJB 3.0 中,TimerService.createTimer(initialDuration, intervalDuration, TimerID)
方法仅接受 initialDuration
和 intervalDuration
参数。
问题是我想在每个月的 1 日运行计时器,但我不能像 EJB 3.1 TimerService
中那样使用 cron 表达式设置我的计时器。
一些解决方法就像每天运行并检查 @Timeout
方法中的日期(如果它是“每月的第一天”),但这不是合适的方法。
我在网上浏览了很多示例/教程,但没有成功。有没有其他方法可以实现这个场景?
最佳答案
我建议采用以下方法:
- 在
@Timeout
方法中使用JodaTime来计算下一个时间点。所以每个计时器都在其@Timeout
方法中安排下一次调用。这样做的好处是您可以构建一个管理对话框,提供系统中计划计时器的概览,如果您只是每天运行计时器,则无法做到这一点。我用它来实现一个相当复杂的、用户可配置的计时器配置(Outlook 风格,例如“每两个月在第三个上午 9:00 运行一次”)。即使使用 JodaTime,我最终还是写了很多代码,虽然。但是,在您的情况下,它不应该那么复杂。基本上就像
timerService.createTimer( new DateTime( System.currentTimeMillis()).plusMonths(1).withTimeAtStartOfDay().toDate(), null );
- 放弃TimerService并使用Quartz直接用于调度。然后,您可以将 cron 表达式直接提供给 API。 Quartz 通常与 Java EE 很好地集成,即使在复杂的集群环境中也是如此。
关于java - EJB 3.0 TimerService - 在每个月的第一天运行计时器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8652244/