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

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

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

现在我正在做:

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

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

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

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

谢谢你的建议….

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

 Trigger trigger = newTrigger() .withIdentity("dailyTrigger", "scheduledReportEmail") .withSchedule(dailyAtHourAndMinute(0, 5) .withMisfireHandlingInstructionIgnoreMisfires()) .build(); 

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

要确定何时给定触发器运行(预定时间与当前时间相比),请在您的工作中运行:

 void execute(JobExecutionContext context) { final Date scheduled = context.getScheduledFireTime() //... } 

也可以看看

  • 上次实际和预定开火时间之间的差异
  • 使用quartz withMisfireHandlingInstructionIgnoreMisfires时的问题
  • 石英调度程序失火指令解释 – 我的文章描述了各种失火指令