石英C#调度程序 - 防止作业在15分钟后自动重试
我想运行需要很长时间才能完成的作业。然而在15分钟后,触发器在作业完成之前被重新启动。我想这是处理失败作业的默认失败保险箱。我如何将此超时时间增加到30分钟?石英C#调度程序 - 防止作业在15分钟后自动重试
这里是我的作业调度代码:
var trigger = TriggerBuilder.Create()
.WithIdentity(triggerName, triggerGroup)
.WithSchedule(CronScheduleBuilder
.CronSchedule(cronExpression).InTimeZone(TimeZoneInfo.Utc))
.Build();
var scheduleRequestJob = JobBuilder.Create<T>()
.WithIdentity(taskName, taskGroup)
.Build();
_scheduler.ScheduleJob(scheduleRequestJob, trigger);
石英无故障安全时间。石英会重新激活你的工作只有两种可能性。
- 触发器的执行时间很短,它会在最后一次运行结束前触发。正如我们从CronExpression中可以看出的那样,情况并非如此。
- 你的工作会抛出一个
JobExecutionException
- (Api),这会马上重新安排你的工作。
为了防止作业同时运行多次,请将DisallowConcurrentExecutionAttribute
- (Api)添加到班级中。
[DisallowConcurrentExecution]
public class MyJob: IJob
{
}
这确保您想要的行为。
我不确定引发异常。它在上一次触发后15分钟重试5次。幸运的是,第五次在14分16秒内完成工作,因此没有重试。是否有可能导致JobExecutionException 15分钟后抛出?过去几个月,这项工作一直没有任何问题。 DisallowConcurrentExecution是否会阻止同一作业运行多次? –
@Dan_Dan_Man是的,它会阻止这一点。我会编辑我的答案,使其更清楚。 JobExecutionException必须由您明确引发才能按照说明进行操作。目前我无法解释为什么Quartz试图重新触发你已经运行的工作。请确保您的作业毫无例外地运行,并且不会抛出'JobExecutionException'。 – Rabban
好的,谢谢。我会试试这个,让你知道它是怎么回事。我的作业中可能会抛出异常,但我从不抛出JobExecutionException。虽然在这种特殊情况下,我不认为有任何例外情况发生。 –
在Quartz中没有这样的故障安全时间。 CronTrigger如何定义(cronExpression)? – Rabban
@Rabban这个特定作业的cron表达式是“0 30 12?* MON-FRI *”。每个工作日下午12:30 –
从历史上看,这是通过创建pid/lock文件的任务来处理的,虽然锁定文件拒绝启动第二个副本 – BugFinder