首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Quart.Net有时会运行重叠的任务

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

Stack Overflow用户
提问于 2019-03-13 21:24:19
回答 1查看 67关注 0票数 0

我正在使用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实现中的问题。这是设计出来的,还是一个bug?如果有一个我可以从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可以防止重复的实例。这听起来像是个bug。我是否需要手动处理,或者我是否应该期望Quartz能够正确处理?

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-04-01 21:13:01

我发现,如果我设置了这个选项,我就不再有重叠的执行作业。但是,如果Quartz没有跟踪正在执行的作业,我仍然希望它会取消作业的取消令牌。

代码语言:javascript
复制
QuartzProperties.Add("quartz.jobStore.clusterCheckinInterval", "60000");
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55142973

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档