c# - Quartz.NET 不一致的行为与非并发失火
问题描述
我一直在尝试 Quartz.NET 中的 DisallowConcurrentExecution 功能,但我发现它的行为有点奇怪。
假设我有一个 Quartz.NET 作业计划每 1 分钟运行一次。然后它会休眠 90 秒并完成。[DisallowConcurrentExecution] 属性确保除第一次执行之外的所有执行都将失败。
我想要发生的是,一旦调度程序空闲(在 1:30),下一个作业就会执行,当那个作业完成时(在 3 分钟),下一个作业开始,依此类推。相反,我发现的是:
它只在一半的时间里做我想做的事,每隔一段时间调度程序就会闲置整整一分钟,而它却错过了越来越多的执行。
经过一番阅读,我认为这是“智能策略”的做法,这是默认的失火处理技术。我尝试设置特定的,但它们没有达到我上面所说的。即使WithMisfireHandlingInstructionNowWithRemainingCount()
没有工作(见截图),根据Java版本的文档应该
如果没有错过任何触发,则重新安排“现在”(...)并将重复计数设置为它将是什么。
那么我是否遗漏了一些东西,另一个选项或警告,或者这是 Quartz 端的错误?如果是后者,是否有解决方法?
解决方案
原来整分钟的空闲时间是由于misfireThreshold
属性,默认为 60 秒。我将其设置为例如 5 秒,如下所示:
NameValueCollection properties = new NameValueCollection
{
["quartz.jobStore.misfireThreshold"] = "5000"
};
我不确定为什么在这种情况下错误阈值需要延迟重试,因为几分钟后,已经等待超过 60 秒的错误执行越来越多。它可能被认为是一个错误。幸运的是,这个特定问题的解决方法很简单。
推荐阅读
- php - 如何检查关联数组是否包含一个值并且仅包含该值?
- dart - 如何强制flutter使用wifi而不是4G?
- django - 使用 django request.META 附加一个新的 Http 标头
- android - 如何将 Flare 动画导入原生 Android 项目?
- gradle - Gradle 如何检测可选命令?
- grafana - 在 Prometheus/Grafana 中创建一个变量,默认选择所有值
- jenkins - 从jenkins下载工件时如何修复“ENOENT:没有这样的文件或目录”
- python - Python中的数据类型更改:使用删除数据类型更改删除行时
- genetic-programming - 在遗传编程 DEAP 中,评估停留在局部最优。如何防止 GP 收敛到局部最优?
- java - 无法正确计算循环