java - EJB 3.0 TimerService - 在每个月的第一天运行计时器

标签 java jakarta-ee timer timeout ejb-3.0

在 EJB 3.0 中,TimerService.createTimer(initialDuration, intervalDuration, TimerID) 方法仅接受 initialDurationintervalDuration 参数。

问题是我想在每个月的 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/

相关文章:

java - 为什么 == 在 Integer 检查值而不是 java 中的引用时,情况与 new 运算符不同

java - 在带有 Spring 的 Web 应用程序中使用 Quartz

c# - 自动关闭消息框

swing - Scala swing 新手问题

java - 为什么 java 编译器不显示明显除以零的警告?

java - 将字符串转换为字符时出现 StringIndexOutOfBoundsException。可能的原因?

java - 特殊字符在 Windows 部署中无法正确显示

java - JSP中的表达式语言: Arithmetic Operator Division

java - 如何在java中克隆对象

c - 在 C 中跟踪任务的执行时间(忽略时间任务被挂起)