4

我第一次尝试设置 Quartz,如果我不理解某些内容,请原谅我。我想知道完成以下任务的最佳方法是什么:

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

现在我只是在做:

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

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

我想到的一种方法基本上是在第 1-31 天设置 31 个每日触发器。笨重.. 那些额外的日子在二月会发生什么?这是最好的方法吗?

我还有每周和每月的触发因素要处理,但我认为如果我们停工三周,那么我们有更大的事情要担心:)

感谢您的任何建议....

4

1 回答 1

10

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

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

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

要确定给定触发器何时运行(计划时间与当前时间相对),请在您的作业中运行:

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

也可以看看

于 2013-01-08T20:04:08.857 回答