4

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

执行恢复触发器恢复时的测试结果(20134 月 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
***
4

0 回答 0