misfire用于Trigger觸發時,線程池中沒有可用的線程或者調度器關閉了,此時這個Trigger變為misfire。當下次調度器啟動或者有可以線程時,會檢查處于misfire狀態的Trigger。而misfire的狀態值決定了調度器如何處理這個Trigger。
最好的文檔是官方文檔。
以下轉自http://blog.sina.com.cn/s/blog_56d8ea900101eu45.html
只有一個線程、多個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定義的withRepeatCountN個線程,M個job如果每個job都misfire(executeTime>Interval)且都是repeatForever,那么系統只會執行前N個job,后面的job不會執行如果到了執行時間點前一任務還在執行中,但是這時有空閑的線程,那么馬上又會執行,這樣一來就會存在同一job被并行執行;很多時候我們是禁止這樣的,為了禁止job在同一時間并行運行,需要在job類上加上標簽:@DisallowConcurrentExecutionquartz有個全局的參數misfireThreshold設置可以允許的超時時間,超過了就不執行,未超過就執行。比如設置了misfireThreshold=30分鐘,如果一個任務定時在10:30執行,但在10:29服務器掛了,在10:50啟動,雖然任務超時了21分鐘,但小于misfireThreshold,所以還是可以執行。而如果服務器11:10才啟動,那就misfire了。對于周期性的任務,如果有misfire的情況出現,則會自動更新CronTrigger的時間周期默認情況下會在當前時間馬上執行前一個被misfire的任務而如果設置MISFIRE_INSTRUCTION_DO_NOTHING,則不對misfire的任務做特殊處理,只從當前時間之后的下一次正常調度時間開始執行產生misfire的前提是:到了該觸發執行時上一個執行還未完成,且線程池中沒有空閑線程可以使用(或有空閑線程可以使用但job設置為@DisallowConcurrentExecution)且過期時間已經超過misfireThreshold滿足以上條件就會觸發quartz的misfire; 如果產生misfire,quartz有多種處理策略:下面是各種不同triigger對應的不同misfire策略CronTriggerwithMisfireHandlingInstructionDoNothing——不觸發立即執行——等待下次Cron觸發頻率到達時刻開始按照Cron頻率依次執行withMisfireHandlingInstructionIgnoreMisfires——以錯過的第一個頻率時間立刻開始執行——重做錯過的所有頻率周期后——當下一次觸發頻率發生時間大于當前時間后,再按照正常的Cron頻率依次執行withMisfireHandlingInstructionFireAndPRoceed(默認)——以當前時間為觸發頻率立刻觸發一次執行——然后按照Cron頻率依次執行SimpleTriggerwithMisfireHandlingInstructionFireNow——以當前時間為觸發頻率立即觸發執行——執行至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值http://blog.sina.com.cn/s/blog_613904cc0101gajk.htmlhttp://my.oschina.net/chenleijava/blog/109904good:http://hedatou.com/archives/introduction_to_quartz.html上面的狀態和quartz-1.8.4 不符:http://www.ibm.com/developerworks/cn/opensource/os-cn-quartz/:cron狀態:MISFIRE_INSTRUCTION_FIRE_ONCE_NOW:就是MISFIRE_INSTRUCTION_SMART_POLICYMISFIRE_INSTRUCTION_DO_NOTHINGsimple狀態,MISFIRE_INSTRUCTION_SMART_POLICY依據不同的repeatCount會有不同的對應結果:MISFIRE_INSTRUCTION_FIRE_NOW:MISFIRE_INSTRUCTION_RESCHEDULE_NEXT_WITH_REMAINING_COUNT:MISFIRE_INSTRUCTION_RESCHEDULE_NOW_WITH_EXISTING_REPEAT_COUNT:新聞熱點
疑難解答