1. 程式人生 > >SpringBoot使用多例項QUARTZ出現重複執行問題

SpringBoot使用多例項QUARTZ出現重複執行問題

專案運行了1個多月,多例項的Quartz一直沒有問題,今天突然出現一個JOB重複執行了2次。檢視日誌發現兩個例項各執行了一次,但是是偶發現象,也就是一會執行一次,一會執行兩次,沒有規律。好奇怪,明明用了多例項Quartz。再次檢視排程器服務的日誌


2017-09-05T11:59:00+08:00
[APP/0]
OUT
2017-09-05 11:59:00.004 INFO 14 --- [ryBean_Worker-3] o.q.p.history.LoggingJobHistoryPlugin : Job DEFAULT.PROBLEM_DISPATCH fired (by trigger DEFAULT.PROBLEM
_DISPATCH) at: 11:59:00 09/05/2017 2017-09-05T11:58:00+08:00 [APP/0] OUT 2017-09-05 11:58:00.009 INFO 14 --- [ryBean_Worker-4] o.q.p.history.LoggingJobHistoryPlugin : Job DEFAULT.PROBLEM_DISPATCH execution complete at 11:58:00 09/05/2017 and reports: null

quartz是先找到trigger再次執行JOB,可是我的專案中有多個定時任務都是1分鐘執行一次,在重複執行的這個JOB1日誌那我發現有個錯誤,是它的後一個JOB2有錯了,原來是同事的這個JOB2程式碼本身寫錯了,導致一直報錯。
猜測是因為當JOB獲得trigger的時間點正好在JOB2獲得trigger時間點時,因為JOB2獲得trigger報錯了,所以導致另一個例項有獲取JOB1一次,這樣兩個例項都獲取到了JOB1的trigger,所以就執行了2次。

解決方法: 對於排程服務中的JOB只寫一個消費服務的具體feign連結就好,再加上hystrix回退,這樣消費者服務出任何錯都不會影響其他服務的JOB。PS:同事就是把feign對應的服務名寫錯了……,唯一一個能出錯的地方,就踩到雷了- _-

疑問:為什麼我獲取trigger時會相互影響?難道是他們在一個Group中的原因?知道的可以告訴我一聲,我是先把trigger加了分組,以防萬一,原來都是預設的DEFAULT。

2018-04-20
我發現以上都是廢話,不知道當時是怎麼想的。。。。
問了下經驗豐富的同事,他給我的回答是,他們的專案也有這個問題,解決方法是:每當任務執行時自己手動加鎖,不用quartz本身的鎖機制。好吧,我有點懂,但是能力有限啊~

還好springboot2.0 本身集成了Quartz,想必不會出現這個問題了吧、

2018-07-18

解決方法:

在配置檔案加上org.quartz.jobStore.acquireTriggersWithinLock=true