只有一個線程、多個job
第一個job產生misfire(executeTime>Interval) 且是repeatForever 那麼只會運行第一個job,後面全部job都沒法運行
第一個job產生misfire(executeTime>Interval) 且是withRepeatCount(N),默認狀況下(withMisfireHandlingInstructionNowWithExistingCount),第一個job執行完後會執行第二個job;
但若是第二個job對應的trigger設置爲:withMisfireHandlingInstructionNextWithExistingCount 或者withMisfireHandlingInstructionNextWithRemainingCount
那麼第二個job永遠也不會執行,由於Schedule在一開始就計算好了每一個Job的FinalTime(經過調用trigger的getFinalFireTime()方法能夠獲得),過了這個時間就再也不執行,可是若是開始執行job2時尚未超過它的FinalTime,系統也會執行job2,可是最終
獲得的執行次數將小於job2定義的withRepeatCount服務器
N個線程,M個job
若是每一個job都misfire(executeTime>Interval)且都是repeatForever,那麼系統只會執行前N個job,後面的job不會執行spa
若是到了執行時間點前一任務還在執行中,可是這時有空閒的線程,那麼立刻又會執行,這樣一來就會存在同一job被並行執行;不少時候咱們是禁止這樣的,爲了禁止job在同一時間並行運行,須要在job類上加上標籤:.net
@DisallowConcurrentExecution線程
quartz有個全局的參數misfireThreshold設置能夠容許的超時時間,超過了就不執行,未超過就執行。
好比設置了misfireThreshold=30分鐘,若是一個任務定時在10:30執行,但在10:29服務器掛了,在10:50啓動,雖然任務超時了21分鐘,但小於misfireThreshold,因此仍是能夠執行。而若是服務器11:10才啓動,那就misfire了。
對於週期性的任務,若是有misfire的狀況出現,則會自動更新CronTrigger的時間週期
默認狀況下會在當前時間立刻執行前一個被misfire的任務
而若是設置MISFIRE_INSTRUCTION_DO_NOTHING,則不對misfire的任務作特殊處理,只從當前時間以後的下一次正常調度時間開始執行 orm
產生misfire的前提是:get
到了該觸發執行時上一個執行還未完成,且線程池中沒有空閒線程可使用(或有空閒線程可使用但job設置爲@DisallowConcurrentExecution)且過時時間已經超過misfireThresholdit
知足以上條件就會觸發quartz的misfire; 若是產生misfire,quartz有多種處理策略:io
下面是各類不一樣triigger對應的不一樣misfire策略
CronTrigger線程池
withMisfireHandlingInstructionDoNothing
——不觸發當即執行
——等待下次Cron觸發頻率到達時刻開始按照Cron頻率依次執行並行
withMisfireHandlingInstructionIgnoreMisfires
——以錯過的第一個頻率時間馬上開始執行
——重作錯過的全部頻率週期後
——當下一次觸發頻率發生時間大於當前時間後,再按照正常的Cron頻率依次執行
withMisfireHandlingInstructionFireAndProceed(默認)
——以當前時間爲觸發頻率馬上觸發一次執行
——而後按照Cron頻率依次執行
SimpleTrigger
withMisfireHandlingInstructionFireNow
——以當前時間爲觸發頻率當即觸發執行
——執行至FinalTIme的剩餘週期次數
——以調度或恢復調度的時刻爲基準的週期頻率,FinalTime根據剩餘次數和當前時間計算獲得
——調整後的FinalTime會略大於根據starttime計算的到的FinalTime值
withMisfireHandlingInstructionIgnoreMisfires
——以錯過的第一個頻率時間馬上開始執行
——重作錯過的全部頻率週期
——當下一次觸發頻率發生時間大於當前時間之後,按照Interval的依次執行剩下的頻率
——共執行RepeatCount+1次
withMisfireHandlingInstructionNextWithExistingCount
——不觸發當即執行
——等待下次觸發頻率週期時刻,執行至FinalTime的剩餘週期次數
——以startTime爲基準計算週期頻率,並獲得FinalTime
——即便中間出現pause,resume之後保持FinalTime時間不變
withMisfireHandlingInstructionNowWithExistingCount(默認)
——以當前時間爲觸發頻率當即觸發執行
——執行至FinalTIme的剩餘週期次數
——以調度或恢復調度的時刻爲基準的週期頻率,FinalTime根據剩餘次數和當前時間計算獲得
——調整後的FinalTime會略大於根據starttime計算的到的FinalTime值
withMisfireHandlingInstructionNextWithRemainingCount
——不觸發當即執行
——等待下次觸發頻率週期時刻,執行至FinalTime的剩餘週期次數
——以startTime爲基準計算週期頻率,並獲得FinalTime
——即便中間出現pause,resume之後保持FinalTime時間不變
withMisfireHandlingInstructionNowWithRemainingCount
——以當前時間爲觸發頻率當即觸發執行
——執行至FinalTIme的剩餘週期次數
——以調度或恢復調度的時刻爲基準的週期頻率,FinalTime根據剩餘次數和當前時間計算獲得
——調整後的FinalTime會略大於根據starttime計算的到的FinalTime值
MISFIRE_INSTRUCTION_RESCHEDULE_NOW_WITH_REMAINING_REPEAT_COUNT——此指令致使trigger忘記原始設置的starttime和repeat-count——觸發器的repeat-count將被設置爲剩餘的次數——這樣會致使後面沒法得到原始設定的starttime和repeat-count值