我正在构建一个执行计划任务的Windows服务,该任务使用Quartz.net定期处理命令队列(来自遗留系统)(每分钟一次)
如果任务花费的时间超过1分钟,这可能是不寻常的,但在某些情况下是可能的,我希望它能够简单地忽略它错过触发的触发器。
然而,我似乎无法实现这一点。它进行处理,然后快速连续快速触发它错过的所有触发器。据我了解,你可以为失火设定一个门槛,但我似乎无法让这个工作。
我在作业上使用[DisallowConcurrentExecution()]以确保任何时候只有一个作业实例在运行。
下面是几个片段。首先传递一些配置信息 - 这是你设置失火阈值的方法吗?
SELECT A.ID,A.NOME,A.SURNAME,A.EMAIL,A.TELEPHONE,B.AD,B.USERNAME,B.PORT
FROM ACCOUNTS A
INNER JOIN BOC B
ON A.TELEPHONE = B.USERNAME
WHERE B.PORT = 16 OR B.PORT = 17
使用我认为是Ignore失火的正确设置来构建触发器:
NameValueCollection config = new NameValueCollection();
config.Add("quartz.jobStore.misfireThreshold", "600000");
schedFact = new StdSchedulerFactory(config);
非常感谢。
工作代码: 只是在这一点上玩粗略的想法,所以只需在控制台应用程序中运行并随机延迟一个作业,这样它就可以在10秒内完成拍摄。经过几次延迟后,所有备份的失火都会连续发射。
var trigger = TriggerBuilder.Create()
.WithIdentity("trigger1", "group1")
.StartNow()
.WithSimpleSchedule( x => x.WithMisfireHandlingInstructionIgnoreMisfires()
.WithIntervalInSeconds(60)
.RepeatForever())
.Build();
答案 0 :(得分:17)
WithMisfireHandlingInstructionIgnoreMisfires()
是你想要的错误方法,并不意味着工作不会触发失火,这意味着它会触发所有错过的所有触发器,然后再回到普通状态时间表。这就是你所看到的。
您需要的是WithMisfireHandlingInstructionNextWithRemainingCount()
。这将通知调度程序忽略失火并等待下一个预定时间。
错误的策略可能有点令人困惑,简明的解释看here(它适用于java调度程序,但无关紧要)。
即使采用正确的策略,您也需要了解失火阈值的工作原理 - 如果您弄错了,您的失火触发器可能仍会触发。
来自文档:“失火是触发器必须错过下一次触发时间的时间跨度,以便将其视为”失火“并因此应用其失火指令”。
您已将值设置为600000
毫秒(此值适用于所有触发器,不幸的是每个触发器没有阈值) - 只有在触发器触发600000
时才会应用失火策略在应该被触发的时间之后的毫秒。您可以根据需要降低或增加它。
有关失火阈值的更多信息,请阅读here。