我在我的项目中使用Quartz.NET 2.1.2。在大多数情况下,正在使用ICronTrigger
(例如,其中一个触发器设置为每天凌晨4点触发)。
因为不跳过作业至关重要,所以每个作业都是在RequestRecovery设置为true的情况下创建的。
IJobDetail jobDetail = JobBuilder.Create<ReportCreationJob>()
.RequestRecovery(true)
.Build();
如果电源关闭,或系统忙于处理请求,触发器可能会少于计划,但最终每个作业成功完成至关重要。每一次失误都在处理中!
将作业的业务逻辑ScheduledFireTimeUtc
(在本例中为4 AM)传递给作业非常重要。一切正常,因为除了在一种情况下,这个信息与IJobExecutionContext
一起传递,那就是当执行恢复作业时(电源关闭的情况,Quartz Scheduler崩溃,......)。
与原始触发器相比,恢复作业在上下文中设置了不同的时间戳。有没有办法检索ScheduledFireTimeUtc
,与原始触发器相同。
有解决方法可以从context.Trigger.FinalFireTimeUtc
检索此信息,但仅限于创建原始作业的恢复时。但是,如果在此恢复作业期间Scheduler再次崩溃,则正在创建“恢复恢复作业”并且原始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
***