当触发恢复触发器时,Quartz.NET获得原始触发器计划时间

时间:2013-04-23 12:24:36

标签: .net triggers jobs quartz.net recovery

我在我的项目中使用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
***

0 个答案:

没有答案