首页 > 解决方案 > Quartz.NET 不一致的行为与非并发失火

问题描述

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

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

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

在此处输入图像描述

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

经过一番阅读,我认为这是“智能策略”的做法,这是默认的失火处理技术。我尝试设置特定的,但它们没有达到我上面所说的。即使WithMisfireHandlingInstructionNowWithRemainingCount()没有工作(见截图),根据Java版本的文档应该

如果没有错过任何触发,则重新安排“现在”(...)并将重复计数设置为它将是什么。

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

标签: c#scheduled-tasksquartz.net

解决方案


原来整分钟的空闲时间是由于misfireThreshold属性,默认为 60 秒。我将其设置为例如 5 秒,如下所示:

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

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


推荐阅读