Quartz.NET行为不一致,并发并发

时间:2018-10-05 12:35:41

标签: c# scheduled-tasks quartz.net

我一直在尝试Quartz.NET中的DisallowConcurrentExecution功能,但是我发现它的行为有些奇怪。

说我有一个Quartz.NET作业,计划每1分钟运行一次。然后睡眠90秒并完成。 [DisallowConcurrentExecution]属性可确保除第一个执行之外的所有执行都会失败。

我要发生的事情是,一旦调度程序释放(在1:30时),下一个作业便会执行,而当该作业完成时(在3分钟时),下一个作业就会启动,依此类推。相反,我发现的是:

enter image description here

它只执行一半的时间,而每隔调度程序在空闲时间徘徊一整分钟,却又丢失了越来越多的执行时,就满足了我的要求。

经过一番阅读后,我认为这是默认的失火处理技术“智能策略”的结果。我尝试设置具体的设置,但没有达到我上面所说的。甚至WithMisfireHandlingInstructionNowWithRemainingCount()也不起作用(请参见屏幕截图),根据Java版本的docs应该

  

重新计划“现在”(...),并将重复计数设置为原来的次数   它没有错过任何射击。

那么我是否缺少某些东西,其他选择或警告,或者这是Quartz一端的错误?如果是后者,是否有解决方法?

1 个答案:

答案 0 :(得分:0)

发现整分钟的空闲时间归因于misfireThreshold属性,默认情况下为60秒。我将其设置为5秒,如下所示:

NameValueCollection properties = new NameValueCollection
{
    ["quartz.jobStore.misfireThreshold"] = "5000"
};

我不确定在这种情况下为什么失火阈值需要延迟重试,因为几分钟后,越来越多的失火执行已等待了60秒以上。它可能被认为是一个错误。幸运的是,解决此特定问题的方法很容易。