我第一次尝试设置Quartz,如果我不理解某些东西,请原谅我。我想知道实现以下目标的最佳方法是什么:
如何设置必须运行每日电子邮件报告的作业,并且还能够从错过的触发器中恢复,以便:1)作业知道触发器被触发的日期。 2)如果(上帝保佑)服务器停机3天,Quartz将通过连续运行三个错过的天来恢复,同时通知作业每个工作代表什么日期。 (只要我知道每个代表什么日子,执行顺序就不重要了)
现在我正在做:
Trigger trigger = newTrigger()
.withIdentity("dailyTrigger", "scheduledReportEmail")
.startNow()
.withSchedule(dailyAtHourAndMinute(0, 5) .withMisfireHandlingInstructionFireAndProceed())
.build();
这似乎只能通过运行一次恢复,无论多少天错过。那是对的吗?
我想到的一种方法基本上是设置31个每日触发器,第1-31天。笨拙......以及2月份可能会发生多少天?这是最好的方法吗?
我还有每周和每月的触发器来处理,但我想如果我们停下来三周,那么我们有更大的事情需要担心:)
感谢任何建议......
答案 0 :(得分:8)
您的用例非常标准,并受Quartz支持。您只需要“忽略失误”政策:
Trigger trigger = newTrigger()
.withIdentity("dailyTrigger", "scheduledReportEmail")
.withSchedule(dailyAtHourAndMinute(0, 5)
.withMisfireHandlingInstructionIgnoreMisfires())
.build();
这基本上意味着:我不关心触发器是否失效,只是尽快运行它(很可能是在应用程序启动时)。
要确定何时给定触发器运行(预定时间与当前时间相比),请在您的工作中运行:
void execute(JobExecutionContext context) {
final Date scheduled = context.getScheduledFireTime()
//...
}