我在我的项目中使用 Quartz.NET 2.1.2。在大多数情况下ICronTrigger
正在使用(例如,其中一个触发器设置为每天凌晨 4 点触发)。因为不跳过作业执行至关重要,所以创建每个作业时将 RequestRecovery 设置为 true。
IJobDetail jobDetail = JobBuilder.Create<ReportCreationJob>()
.RequestRecovery(true)
.Build();
如果电源关闭,或者系统忙于处理请求,触发器可能会稍微偏离计划,但最终每项工作是否成功完成至关重要。每一次失火都在处理中!
将作业的业务逻辑ScheduledFireTimeUtc
(在本例中为凌晨 4 点)传递给作业很重要。一切正常,因为IJobExecutionContext
除了在一种情况下会传递此信息,那就是在执行恢复作业时(电源关闭、Quartz 调度程序崩溃等情况)。
与原始触发器相比,恢复作业在上下文中设置了不同的时间戳。有没有办法检索ScheduledFireTimeUtc
与原始触发器相同的方法。
有一种解决方法可以从中检索此信息,context.Trigger.FinalFireTimeUtc
但仅限于创建原始作业的恢复时。但是,如果调度程序在此恢复作业期间再次崩溃,则正在创建“恢复作业的恢复”并且原始文件ScheduledFireTimeUtc
丢失。
我将在下面添加来自测试客户端的其他信息。
代码打印行IJobExecutionContext
:
string.Format("****{0}Job {1} with {0}Scheduled time={4} {0}Fired at={2} {0}Next scheduled time={3} {0}Recovering={5} {0}FinalFireTimeUtc={6} {0}***",
Environment.NewLine,
context.JobDetail.Key,
context.FireTimeUtc.HasValue ? context.FireTimeUtc.Value.ToString("r") : "NULL",
context.NextFireTimeUtc.HasValue ? context.NextFireTimeUtc.Value.ToString("r") : "NULL",
context.ScheduledFireTimeUtc.HasValue ? context.ScheduledFireTimeUtc.Value.ToString("r") : "NULL",
context.Recovering,
context.Trigger.FinalFireTimeUtc.HasValue ? context.Trigger.FinalFireTimeUtc.Value.ToString("r") : "NULL");
执行恢复原始触发器时的测试结果(2013 年 4 月 23 日星期二 09:45:30 GMT是原始预定时间):
***
Job TestGroup.Test10 with
Scheduled time=Tue, 23 Apr 2013 09:51:05 GMT
Fired at=Tue, 23 Apr 2013 09:51:45 GMT
Next scheduled time=NULL
Recovering=True
FinalFireTimeUtc=Tue, 23 Apr 2013 09:45:30 GMT
***
执行恢复触发器恢复时的测试结果(2013年4 月 23 日星期二 09:45:30 GMT是原计划时间,但在恢复级联中丢失):
***
Job TestGroup.Test10 with
Scheduled time=Tue, 23 Apr 2013 10:52:07 GMT
Fired at=Tue, 23 Apr 2013 10:52:17 GMT
Next scheduled time=NULL
Recovering=True
FinalFireTimeUtc=Tue, 23 Apr 2013 09:51:05 GMT
***