目前有一個按月累計折舊的定時任務,測試環境要配合業務測試,所以手工先停服務器,修改Linux系統時間,再啟動服務器,但是出現問題,啟動的時候有時候多執行一次,定凌晨5點定時啟動,我修改時間為4點55, 56的時候服務器起來,執行了一次定時任務,5點准時又執行了一次,而且這個是不定時出現的,一晚測試30次,出現了5次多跑的情況,
現象和這個帖子相似 https://www.iteye.com/blog/kanbol-1160826
quartz有個全局的參數misfireThreshold設置可以允許的超時時間,超過了就不執行,未超過就執行。
比如設置了misfireThreshold=30分鍾,如果一個任務定時在10:30執行,但在10:29服務器掛了,在10:50啟動,雖然任務超時了21分鍾,但小於misfireThreshold,所以還是可以執行。而如果服務器11:10才啟動,那就misfire了。
對於周期性的任務,如果有misfire的情況出現,則會自動更新CronTrigger的時間周期
默認情況下會在當前時間馬上執行前一個被misfire的任務
而如果設置MISFIRE_INSTRUCTION_DO_NOTHING,則不對misfire的任務做特殊處理,只從當前時間之后的下一次正常調度時間開始執行
查了一下我們配置的misfireThreshold是60秒,不應該出現這個情況,而且我們沒有延遲執行任務,
最后結局方案就是把這個misfireThreshold改成0了,另外測試的時候重啟服務時先修改時間,然后等幾分鍾再重啟,基本上沒有遇到這個問題
quartz 2.4 已不支持 misfireThreshold=0 了

