我们以不同的时间表运行 Quartz.NET 来处理从每 30 秒到每周一次的各种作业。
在查看我们的内部日志记录时,我们发现一些作业无缘无故停止运行,而其他作业仍在继续运行。例如,我们的每 30 秒作业在给定时间失败,而另一个每 10 分钟作业持续了几个小时,然后也失败了。日常任务后来停止了。
我们启用了 Quartz 日志记录并发现以下内容。
以前成功的火灾记录:
2014-09-19 08:20:00.0130 DEBUG Producing instance of Job 'DEFAULT.Scheduled task #5', class=TaskRunner
2014-09-19 08:20:00.0130 DEBUG Calling Execute on job DEFAULT.Scheduled task #5
2014-09-19 08:20:00.0130 DEBUG Batch acquisition of 1 triggers
2014-09-19 08:20:00.8710 DEBUG Trigger instruction : NoInstruction
2014-09-19 08:20:00.8710 DEBUG Batch acquisition of 1 triggers
第一次失败的日志:
2014-09-19 08:30:00.0046 DEBUG Producing instance of Job 'DEFAULT.Scheduled task #5', class=TaskRunner
2014-09-19 08:30:00.0046 DEBUG Calling Execute on job DEFAULT.Scheduled task #5
2014-09-19 08:30:00.0046 DEBUG Batch acquisition of 1 triggers
此后,直到我们重新启动服务,该特定作业才再次运行。没有迹象表明我们的任何代码都在这个特定实例上运行,因为我们在内部进行了自己的日志记录,这在当时还没有发生。
我们为每项工作配置的失火处理如下:
... TriggerBuilder.Create()
.WithCronSchedule( task.CronSchedule, x => x.WithMisfireHandlingInstructionDoNothing())
.Build();
我了解“DoNothing”指令告诉它跳过这场火灾并继续执行计划。因此,如果发生失火,我希望它在下一次开火时再次开火。
1) 为什么我们的 Quartz 作业会随机失败?
2)我们可以做些什么来进一步调查?