石英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); 
+0

在Quartz中没有这样的故障安全时间。 CronTrigger如何定义(cronExpression)? – Rabban

+0

@Rabban这个特定作业的cron表达式是“0 30 12?* MON-FRI *”。每个工作日下午12:30 –

+0

从历史上看,这是通过创建pid/lock文件的任务来处理的,虽然锁定文件拒绝启动第二个副本 – BugFinder

石英无故障安全时间。石英会重新激活你的工作只有两种可能性。

  1. 触发器的执行时间很短,它会在最后一次运行结束前触发。正如我们从CronExpression中可以看出的那样,情况并非如此。
  2. 你的工作会抛出一个JobExecutionException - (Api),这会马上重新安排你的工作。

为了防止作业同时运行多次,请将DisallowConcurrentExecutionAttribute - (Api)添加到班级中。

[DisallowConcurrentExecution] 
public class MyJob: IJob 
{ 
} 

这确保您想要的行为。

+0

我不确定引发异常。它在上一次触发后15分钟重试5次。幸运的是,第五次在14分16秒内完成工作,因此没有重试。是否有可能导致JobExecutionException 15分钟后抛出?过去几个月,这项工作一直没有任何问题。 DisallowConcurrentExecution是否会阻止同一作业运行多次? –

+0

@Dan_Dan_Man是的,它会阻止这一点。我会编辑我的答案,使其更清楚。 JobExecutionException必须由您明确引发才能按照说明进行操作。目前我无法解释为什么Quartz试图重新触发你已经运行的工作。请确保您的作业毫无例外地运行,并且不会抛出'JobExecutionException'。 – Rabban

+0

好的,谢谢。我会试试这个,让你知道它是怎么回事。我的作业中可能会抛出异常,但我从不抛出JobExecutionException。虽然在这种特殊情况下,我不认为有任何例外情况发生。 –