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.