Quartz.NET 非并发失火的不一致行为

Quartz.NET inconsistent behavior with non-concurrent misfires

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

假设我有一个 Quartz.NET 作业安排为每 1 分钟 运行。然后它会休眠 90 秒并结束。 [DisallowConcurrentExecution] 属性确保除了第一次执行之外的所有执行都将失败。

我想要发生的是,一旦调度程序空闲(在 1:30),下一个作业就会执行,当那个作业完成时(在 3 分钟),下一个作业就会开始,并且很快。相反,我发现的是:

它只有一半的时间做我想做的事,每隔一段时间调度程序就会闲置一整分钟,而它会错过越来越多的执行。

经过一些阅读,我认为这是 'smart policy' 的作用,默认的失火处理技术。我尝试设置特定的,但它们没有达到我上面所说的。即使 WithMisfireHandlingInstructionNowWithRemainingCount() 也不起作用(见屏幕截图),根据 Java 版本的 docs 应该

re-schedule 'now' (...) with the repeat count set to what it would be, if it had not missed any firings.

所以我是否遗漏了某些东西、另一个选项或警告,或者这是 Quartz 端的错误?如果是后者,是否有解决方法?

原来整分钟的空闲时间是由于 misfireThreshold 属性,默认情况下为 60 秒。我会把它设置为例如5秒,如下:

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

我不确定为什么在这种情况下 misfirethreshold 需要延迟重试,因为几分钟后,已经等待超过 60 秒的 misfired 执行越来越多。它可能被认为是一个错误。幸运的是,这个特定问题的解决方法很简单。