让Quartz.net忽略失火

时间:2015-05-20 19:27:45

标签: quartz-scheduler quartz.net

我正在构建一个执行计划任务的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();

1 个答案:

答案 0 :(得分:17)

WithMisfireHandlingInstructionIgnoreMisfires()是你想要的错误方法,并不意味着工作不会触发失火,这意味着它会触发所有错过的所有触发器,然后再回到普通状态时间表。这就是你所看到的。

您需要的是WithMisfireHandlingInstructionNextWithRemainingCount()。这将通知调度程序忽略失火并等待下一个预定时间。 错误的策略可能有点令人困惑,简明的解释看here(它适用于java调度程序,但无关紧要)。

即使采用正确的策略,您也需要了解失火阈值的工作原理 - 如果您弄错了,您的失火触发器可能仍会触发。

来自文档:“失火是触发器必须错过下一次触发时间的时间跨度,以便将其视为”失火“并因此应用其失火指令”。

您已将值设置为600000毫秒(此值适用于所有触发器,不幸的是每个触发器没有阈值) - 只有在触发器触发600000时才会应用失火策略在应该被触发的时间之后的毫秒。您可以根据需要降低或增加它。

有关失火阈值的更多信息,请阅读here