gpt4 book ai didi

quartz-scheduler - 让 Quartz.net 忽略失火

转载 作者:行者123 更新时间:2023-12-03 23:36:04 25 4
gpt4 key购买 nike

我正在构建一个 Windows 服务,它正在执行计划任务,该任务使用 Quartz.net 定期(每分钟一次)处理命令队列(来自旧系统)

如果任务花费的时间超过 1 分钟,这在某些情况下是不寻常的,但在某些情况下是可能的,我希望它简单地忽略它错过的触发器。

但是,我似乎无法做到这一点。它进行处理,然后快速连续快速触发它错过的所有触发器。据我了解,您可以为失火设置阈值,但我似乎无法使其正常工作。

我在 Job 上使用 [DisallowConcurrentExecution()] 以确保在任何时候只有一个作业实例正在运行。

下面是几个片段。首先传入一些配置信息 - 这是您设置失火阈值的方式吗?

    NameValueCollection config = new NameValueCollection();
config.Add("quartz.jobStore.misfireThreshold", "600000");

schedFact = new StdSchedulerFactory(config);

使用我认为正确的 Ignore misfires 设置构建触发器:
    var trigger = TriggerBuilder.Create()
.WithIdentity("trigger1", "group1")
.StartNow()
.WithSimpleSchedule( x => x.WithMisfireHandlingInstructionIgnoreMisfires()
.WithIntervalInSeconds(60)
.RepeatForever())
.Build();

非常感谢您的想法。

工作代码:
在这一点上只是玩一些粗略的想法,所以只需在控制台应用程序中运行并随机延迟一项工作,以便它在刚刚设置为 10 秒的间隔内拍摄。经过几次延迟后,所有备份的失火都快速连续触发。
[DisallowConcurrentExecution()]
public class SomeJob : IJob
{
public SomeJob() { }
public void Execute(IJobExecutionContext context)
{
Random rnd = new Random(DateTime.UtcNow.Second);
int delay = rnd.Next(2);
Console.WriteLine("Executing Job with delay of "+ delay + " at " + DateTime.UtcNow.ToString());

if (delay == 1)
{
System.Threading.Thread.Sleep(1000 * 25); // sleep for 25 seconds
}
}
}





Example console output:
Executing Job with delay of 1 at 21/05/2015 21:27:17
Executing Job with delay of 1 at 21/05/2015 21:27:42
Executing Job with delay of 0 at 21/05/2015 21:28:07 <-- stacked misfires
Executing Job with delay of 0 at 21/05/2015 21:28:07 <--
Executing Job with delay of 0 at 21/05/2015 21:28:07 <--
Executing Job with delay of 0 at 21/05/2015 21:28:07 <--
Executing Job with delay of 0 at 21/05/2015 21:28:16
Executing Job with delay of 0 at 21/05/2015 21:28:26
Executing Job with delay of 1 at 21/05/2015 21:28:36
Executing Job with delay of 0 at 21/05/2015 21:29:01
Executing Job with delay of 0 at 21/05/2015 21:29:01
Executing Job with delay of 1 at 21/05/2015 21:29:06

最佳答案

WithMisfireHandlingInstructionIgnoreMisfires()是您想要的错误方法,这并不意味着作业不会触发失火,这意味着它将尽快触发所有错过的触发器,然后返回到正常计划。这就是你所看到的。

您需要的是WithMisfireHandlingInstructionNextWithRemainingCount() .这将通知调度程序忽略失火并等待下一个调度时间。
失火策略可能有点令人困惑,要获得简洁的解释,请查看 here (它是针对 java 调度程序的,但没关系)。

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

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

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

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

关于quartz-scheduler - 让 Quartz.net 忽略失火,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30358718/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com