Quart.Net有时会运行重叠任务

问题描述 投票:0回答:1

我正在使用Quartz.Net 3.0.7来管理调度程序。在我的测试环境中,我有两个调度程序实例正在运行。我有一个测试过程,在结束前正好运行2个小时。 Quartz配置为每10秒启动一次进程,我使用DisallowConcurrentExecution属性来防止多个任务实例同时运行。 80%的时间这是按预期工作的。 Quartz将启动该过程,并阻止任务的任何其他实例启动,直到完成初始任务后。如果我停止托管Quart的两个服务之一,那么另一个实例将在接下来的10秒标记处接收任务。

然而,在保持这两个Quartz服务连续运行48小时之后,我发现了几次事情发生了可怕的错误。有时主机B将启动任务,即使任务仍处于主机A执行2小时的过程中。有一次我甚至发现该进程已在主机B上启动3次,所有这些都在10分钟内完成期。因此,在两个小时的时间内,一个任务有三个实例同时运行。在完成所有三个之后,Quartz回到了预期的时间表,一次只运行一个实例。

如果这些重叠的任务在100%的时间内发生,我认为我的结果有问题,但由于它似乎只发生了大约20%的时间,我认为它必须是Quartz实现中的一些东西。这是设计还是错误?如果有一个事件,我可以从Quart.Net捕获,告诉我另一个任务实例已启动,我可以听取并停止现有任务运行。我只需要确保DisallowConcurrentExecution得到遵守并阻止任务同时运行多个实例。谢谢。

编辑:我添加了逻辑,使用context.Scheduler.GetCurrentlyExecutingJobs查找任何具有相同JobDetail.Key的作业,但在我的任务启动时查找不同的FireInstanceId。如果我找到另一个当前正在执行的作业,我将阻止此实例做任何事情。我发现在重复的并发场景中,Quartz报告当前没有其他作业使用相同的JobDetail.Key执行。应该可以吗?在什么情况下Quartz.Net会启动一个IJob,几分钟后就会把它作为执行作业丢失,但允许它继续执行而不取消CancellationToken?

Edit2:我在我的日志中找到了一个实例,Quartz按预期启动了一个任务。然后,一分钟后,Quartz尝试启动另外9个实例,每个实例都有不同的FireInstanceId。我的自定义代码阻止了另外9个实例,因为通过调用GetCurrentlyExecutingJobs获取正在运行的作业列表,它可以看到原始实例仍然存在。我仔细检查了ConcurrentExecutionDisallowed标志在运行时的所有任务中是真的,所以我希望Quartz可以防止重复的实例。这听起来像个错误。我希望手动处理这个,还是我希望Quartz能够做到这一点?

编辑3:我肯定在看两个不同的问题。在这两种情况下,Quartz.Net都使用新的FireInstanceId启动我的IJob实例,同时已经为同一个JobKey运行了另一个FireInstanceId。在一种情况下,我可以通过调用GetCurrentlyExecutingJobs看到两个FireInstanceId都处于活动状态。在第二个方案中,调用GetCurrentlyExecutingJobs显示第一个FireInstanceId不再运行,即使我可以从我的日志中看到原始实例仍在运行。这两种情况都导致我的IJob的多个实例同时运行,这是不可接受的。通过在我的IJob启动时调用GetCurrentlyExecutingJobs来解决第一个场景很容易,但第二个场景更难。我将不得不在一个时间间隔ping GetCurrentlyExecutingJobs并停止任务,如果它的FireInstanceId已从活动列表中消失。还有其他人真的没有注意到这种行为吗?

quartz.net
1个回答
0
投票

我发现,如果我设置此选项,我不再有重叠的执行作业。我仍然希望Quartz取消作业的取消令牌,但是,如果它忘记了正在执行的工作。

QuartzProperties.Add("quartz.jobStore.clusterCheckinInterval", "60000");
© www.soinside.com 2019 - 2024. All rights reserved.