2017-03-01 51 views
0

我想運行需要很長時間才能完成的作業。然而在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

回答

0

石英無故障安全時間。石英會重新激活你的工作只有兩種可能性。

  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。雖然在這種特殊情況下,我不認爲有任何例外情況發生。 –