Quartz.NET:在iStatefulJob实例上需要CronTrigger *延迟而不是跳过*如果在计划成熟时运行作业

问候,您友好的邻居Quartz.NET n00b回来了! 我有一个Windows服务在基于Quartz.NET CronTrigger的调度方案上运行iStatefulJob实例...用于调度作业的CRON字符串:“0 0/1 * * *?*” 一切都很好。但是,如果我有一个设置为运行的作业,比如每分钟的X:00标记,并且该作业恰好运行超过一分钟,我注意到作业完成后后续作业立即运行执行,而不是等到下一次计划的运行,有效地“排队”而不是仅仅跳过作业,直到下一次计划运行。 我在触发器中输入了一个COTTrigger MisfireInstruction of DONOTHING,但是当一个作业超出其下一个计划的执行计划时,就会发生同样的事情。 如果iStatefulJob实例当前正在运行,而不是让它延迟直到第一次执行完成,那么如何才能使iStatefulJob实例成为SKIP? 我明确设置了trigger.MisfireInstruction = MisfireInstruction.CronTrigger.DoNothing; ...但是,对于计划每分钟运行一次需要90秒才能完成的作业而不是“无所事事”,我会遇到以下执行日志: 工作在上午9:00:00运行,在上午9:01:30结束< - 作业运行1:30 工作时间为上午9:01:30,上午9:03:00结束< - 后续工作应该在9:01:00运行 工作在上午9:04:00运行,在上午9:05:30结束< - 不应该在9:03:00运行吗? 工作时间为上午9:05:30,上午9:07:00结束< - 后续工作应该在9:05:00运行 工作在上午9:08:00运行,在上午9:09:30结束< - 不应该在9:07:00运行吗? ......好像它第一次运行正确,在第一次......因为90秒的作业执行时间到期而延迟30秒,然后,而不是等到下一个完整的分钟,立即执行30秒标记...奇怪的是,它在分钟标记处完成了第二个工作,但是等到NEXT分钟标记执行而不是运行它返回... 2-back ... 几乎看起来它在每次运行时都能正常工作,当它没有运行在:30分时...... 什么是让工作不延迟/排队的最好方法,但只是跳到空闲直到下一个计划成熟为止? 编辑:我尝试使用相同的DONOTHING触发器失火指令返回iJobs而不是iStatefulJobs,但是尽管先前的执行仍处于活动状态,但作业仍然执行每分钟。如果当前正在使用iJob或iStatefulJob运行,我似乎无法跳过预定的运行... 编辑#2:我认为我的触发器永远不会失火,这就是为什么DoNothing作为失火指令是无用的......鉴于这种情况,我想我需要另一种机制来检测一个计划的作业实例是否正在运行以确保SKIPS的下一次执行工作直到下一个预定的时间,而不是将其推迟到第一次实例完成... EDIT3:我尝试在iStatefulJob jobdatamap中添加一个名为“IsRunning”的元素......我在执行序列启动时将其设置为TRUE,然后在作业完成后将其返回false。在执行之前,它会检查显然在作业之间持久存在的元素,如果检测到它是真的,则过早地退出执行(记录“JOB SKIPPED!”)......遗憾的是,这可能不起作用,原因可能是显而易见的:如果作业按照上面的项目符号计划运行,则作业永远不会同时自行运行,因为它会延迟运行直到作业结束,因此此检查无效。根据文档,从iStatefulJob返回iJob在这里没有帮助,因为jobdatamap只存在于有状态作业类型的作业之间... 我仍然没有解决如何跳过预定的工作而不是推迟它直到当前的迭代完成...如果有人有想法,你就是救星! :)     
已邀请:
它应该由RAMJobStore的misfireThreshold引起(http://quartznet.sourceforge.net/apidoc/topic2722.html)。   触发器必须的时间跨度   已经错过了下一次火灾时间   为了考虑它   “失误”,因而失败了   适用的指令。 默认为60秒。因此,工作不会被视为“失火”,直到迟到超过错误的阈值。 要解决此问题,只需降低此阈值(代码设置低于1毫秒):
...   
properties["quartz.jobStore.misfireThreshold"] = "1";
...
schedulerFactory = new StdSchedulerFactory(properties);
它应该解决这个问题。     

要回复问题请先登录注册