2017-02-15 70 views
1

我觀察到,在服務器退出節能模式後,正常計劃在午夜(但無法執行,因爲服務器進入節能模式)的作業得到執行。這會導致意外的執行時間。如何不執行超出預定時間的作業

有沒有辦法告訴Quartz在他們的目標時間太遠後不能執行任務?

回答

1

是的。您只需告訴Quartz該怎麼做job misfires

觸發器的另一個重要屬性是它的「失火指令」。如果由於調度程序正在關閉而導致持續觸發器「遺漏」其觸發時間,或者Quartz的線程池中沒有可用的線程來執行作業,則會發生失火。不同的觸發類型可以使用不同的失火指令。默認情況下,他們使用「智能策略」指令 - 它具有基於觸發類型和配置的動態行爲。當調度程序啓動時,它會搜索任何發生故障的持續觸發器,然後根據各自配置的失火指令更新每個觸發器。當你開始在自己的項目中使用Quartz時,你應該讓自己熟悉在給定觸發器類型上定義的失火指令,並在他們的JavaDoc中進行解釋。

具體失火指令取決於您使用的Trigger類型。對於每天的工作這可能是這樣的:

trigger = newTrigger() 
     .withIdentity("trigger1", "group1") 
     .withSchedule(dailyAtHourAndMinute(0,0) 
       .withMisfireHandlingInstructionDoNothing()) // set misfire instruction 
     .build(); 

但同樣,這取決於觸發器的類型。只需使用IDE來查看withMisfire*()方法是否可用,並使用withMisfireHandlingInstructionDoNothingwithMisfireHandlingInstructionNextWithRemainingCount(都將忽略錯過的執行並等待下一個預定的方法)。

當我必須瞭解不同類型的失火指令時,除Quartz的教程和API文檔外,我還使用了this blog entry

+0

謝謝!我使用CronTrigger像這樣'TriggerBuilder.newTrigger()。withSchedule(CronScheduleBuilder.cronSchedule(cronSchedule).withMisfireHandlingInstructionDoNothing())。build();'。我會看看是否能解決我的問題,但我很有信心。 –

+0

@MartinFernau它怎麼樣了? – walen

+0

看起來不錯。今天的測試表明,這些工作不再被執行。謝謝! –