如何防止 Quartz.Net 失败的作业重试
How to prevent Quartz.Net misfired job from retrying
我知道我可以在构建触发器时指定 .WithMisfireHandlingInstructionDoNothing() 但我的一些作业是通过 IScheduler.TriggerJob() 方法,所以没有任何触发器。
我可以在 ITriggerListener 侦听器中检测并记录失火,但我如何才能阻止 Quartz 再次尝试启动该作业?如果我理解正确 .VetoJobExecution 不可用,因为无论如何都必须成功触发作业。
还有其他想法吗?
编辑:我的实现
JobDataMap jobData = new JobDataMap(data);
IJobDetail jobTemplate = await jobScheduler.GetJobDetail(jobKey);
var jobTrigger = TriggerBuilder.Create()
.ForJob(jobTemplate)
.UsingJobData(jobData)
.WithSimpleSchedule(s => s.WithRepeatCount(0).WithMisfireHandlingInstructionNextWithRemainingCount())
.StartNow()
.Build();
await jobScheduler.ScheduleJob(jobTrigger);
好吧,如果您只想要 TriggerJob
行为,您可以通过向调度程序添加一个简单的触发器来实现这一点,该触发器将立即触发并为此配置重试策略。因此,如果您可以更改 TriggerJob
的调用站点以创建一个简单的触发器(可能是允许定义策略的扩展方法),则 TriggerJob is here.
的 Quartz 源代码
我知道我可以在构建触发器时指定 .WithMisfireHandlingInstructionDoNothing() 但我的一些作业是通过 IScheduler.TriggerJob() 方法,所以没有任何触发器。
我可以在 ITriggerListener 侦听器中检测并记录失火,但我如何才能阻止 Quartz 再次尝试启动该作业?如果我理解正确 .VetoJobExecution 不可用,因为无论如何都必须成功触发作业。
还有其他想法吗?
编辑:我的实现
JobDataMap jobData = new JobDataMap(data);
IJobDetail jobTemplate = await jobScheduler.GetJobDetail(jobKey);
var jobTrigger = TriggerBuilder.Create()
.ForJob(jobTemplate)
.UsingJobData(jobData)
.WithSimpleSchedule(s => s.WithRepeatCount(0).WithMisfireHandlingInstructionNextWithRemainingCount())
.StartNow()
.Build();
await jobScheduler.ScheduleJob(jobTrigger);
好吧,如果您只想要 TriggerJob
行为,您可以通过向调度程序添加一个简单的触发器来实现这一点,该触发器将立即触发并为此配置重试策略。因此,如果您可以更改 TriggerJob
的调用站点以创建一个简单的触发器(可能是允许定义策略的扩展方法),则 TriggerJob is here.