1. 程式人生 > >quartz當機器掛掉重啟後定時任務後執行的策略

quartz當機器掛掉重啟後定時任務後執行的策略

quartz,java世界裡面的任務管理容器。

至於為什麼會有misfire這個概念,我想可以重這三個方面來進行說明:

1 所有的執行緒都在忙於更高優先順序的任務

2 任務本身CRASH了

3 程式碼的BUG,導置錯誤的設定了JOB

基於這3種原因,其實也是現實世界中的常理。沒有任何事情,都能保證100%執行OK。quartz提出了misfire的理論,讓任務在錯過之後,還能正常的執行。

以下分別對幾種型別的JOB進行說明:

without repeating(不重複的JOB)

這裡只列出有代表的屬性進行說明,這個JOB執行的時間為過去10秒之前,所以肯定會觸發misfire

withMisfireHandlingInstructionFireNow(失效之後再恢復並馬上執行)

就是當某個任務在理論執行的時間點沒有執行,當任務正常起來之後,馬上就去執行剛才未執行的任務。

withMisfireHandlingInstructionNextWithRemainingCount(失效之後不處理)

錯過之後,不用管。

其它詳細說明

這個其實比較簡單。來看第二種

repeating fixed number of times(多次執行)

這個任務是說從9點開始,每隔一個小時,會執行一次,直到下午4點.

withMisfireHandlingInstructionFireNow(失效之後,再啟動馬上執行,總次數還是7次)

如果任務在10點的時候沒有觸發,但是在10:15分的時候執行了misfire,以後每次正點執行的時間就會較初始值晚15分鐘,直到16:15

withMisfireHandlingInstructionNowWithExistingCount(失效之後,再啟動之後馬上執行,但是起始次數清零,總次數=7+當前misfire執行次數-1)

如果任務在10點沒有觸發,10:15分執行了misfire,以後執行時間都會較初始值晚15分鐘,但是執行次數還是原來的7次,就會到17:15了。

withMisfireHandlingInstructionNextWithRemainingCount(失效之後,不管donothing,總次數還是7次)

withMisfireHandlingInstructionNextWithExistingCount(失效之後,donothgin,總次數=misfire的次數+7)

詳情如圖:

repeating infinitely(不停的執行)

這個任務是說從9點開始,每隔一個小時就會執行。

withMisfireHandlingInstructionFireNow(每次失效之後,在下個失效節點再執行)

這個模式下,withMisfireHandlingInstructionNowWithRemainingCount ,withMisfireHandlingInstructionNowWithExistingCount都是 一個意思。

withMisfireHandlingInstructionNextWithRemainingCount(每次失效之後,在下個定義的時間點再執行)

這個同withMisfireHandlingInstructionNextWithExistingCount的配置

CRON triggers(表示式,最複雜的)

在每個星期的週一至週五的上午9點到下午17點,每隔一個小時執行一次。

withMisfireHandlingInstructionIgnoreMisfires(所有misfire的任務會馬上執行)

打個比方,如果9點misfire了,在10:15系統恢復之後,9點,10點的misfire會馬上執行

withMisfireHandlingInstructionDoNothing(所有的misfire不管,執行下一個週期的任務)

withMisfireHandlingInstructionFireAndProceed(會合並部分的misfire,正常執行下一個週期的任務)

假設9,10的任務都misfire了,系統在10:15分起來了。只會執行一次misfire,下次正點執行。

現在,你瞭解到,不同模式的相同配置,misfire的行為其實是不一樣的。大的方向其實就三個

1 忽略

2 立即執行

3 繼續

4 放棄

5 等待下一個週期

最終就是根據合適的策略,選擇合適的misfire.