石英从多天失火中恢复过来

Eri*_*c M 4 java quartz-scheduler

我是第一次尝试设置Quartz,如果我不理解某些东西,请原谅我.我想知道实现以下目标的最佳方法是什么:

如何设置必须运行每日电子邮件报告的作业,并且还能够从错过的触发器中恢复,以便:1)作业知道触发器被触发的日期.2)如果(上帝保佑)服务器停机3天,Quartz将通过连续运行三个错过的日子来恢复,同时通知作业每个工作代表什么日期.(执行顺序并不重要,只要我知道每个代表什么日子)

现在我正在做:

Trigger trigger = newTrigger() 
.withIdentity("dailyTrigger", "scheduledReportEmail") 
.startNow() 
.withSchedule(dailyAtHourAndMinute(0, 5) .withMisfireHandlingInstructionFireAndProceed()) 
.build(); 
Run Code Online (Sandbox Code Playgroud)

无论多少天错过,这似乎只能通过运行一次恢复.那是对的吗?

我想到的一种方法基本上是设置31个每日触发器,第1-31天.笨拙......以及2月份可能会发生多少天?这是最好的方法吗?

我也有每周和每月的触发器来处理,但我想如果我们停下来三周,那么我们有更大的事情要担心:)

谢谢你的建议....

Tom*_*icz 8

您的用例非常标准,并受Quartz支持.你只需要" 忽略失火 "政策:

Trigger trigger = newTrigger() 
  .withIdentity("dailyTrigger", "scheduledReportEmail") 
  .withSchedule(dailyAtHourAndMinute(0, 5)
  .withMisfireHandlingInstructionIgnoreMisfires()) 
  .build(); 
Run Code Online (Sandbox Code Playgroud)

这基本上意味着:我不关心触发器是否失效,只是尽快运行它(这很可能是在应用程序启动时).

要弄清楚什么时候给定触发器运行(预定时间是什么而不是当前时间),在你的工作中运行:

void execute(JobExecutionContext context) {
  final Date scheduled = context.getScheduledFireTime()
  //...
}
Run Code Online (Sandbox Code Playgroud)

也可以看看

  • 谢谢!我实际上同时发现了这个,但你的答案是完全正确的!政策名称肯定让我失望,我没想到会有一些叫做"忽略失火"的东西来执行所有错过的触发器.但是,根据您的解释,名称确实有意义.此外,getScheduledFireTime()也正是我所需要的! (3认同)
  • 嗨 Tomasz,我正在尝试将 withMisfireHandlingInstructionIgnoreMisfires() 与 JdbcJobStore 和 SimpleTrigger 一起使用,重复次数为 0。但一旦超过预定时间,石英就不会处理触发器。意思是,它只是忽略了处理失火的触发器。这可能是什么原因?相同的程序可以与具有相同失火指令的 RamJobStore 配合使用。使用 RamjobStore,作业将按照您上面的解释执行(即尽快)。 (3认同)