集群环境下,谁偷走quartz配置的定时任务
錯誤現象:
在本地開發環境中,應用服務啟動后TRIGGER_STATE直接就變為ERROR
?
?前段時間在項目中,使用quartz配置一個定時任務,定時任務都持久化到oracle數據庫中,但是應用服務器啟動后,數據庫qrtz_triggers(trigger信息表)中,對應的任務數據的TRIGGER_STATE字段就直接變為ERROR,導致定時任務不執行。
?
沒有錯誤log日志,出錯原因難定位。
對以下可能出錯的原因進行了調查:
1.quartz文件配置錯誤
? ① 檢查配置文件,調查結果是,配置文件沒有發現錯誤。
? ② 項目中已經配置有一條定時任務A,但是任務A能正常執行。
? ③ 將任務A的quartz配置注釋,只留下新增配置的定時任務,啟動后還是一樣報錯。
項目中,其他子系統也使用了quartz配置定時任務,可以排除不是quartz配置文件錯誤。
?
2.定時任務實現類出錯
? ① 定時任務實現類中,將業務邏輯全部注釋,只輸出system.out.println,但啟動后,也報錯。(經過很多次的調試,有時應用服務器啟動,也能正常的執行一次新增的定時任務,但后面TRIGGER_STATE就又變為ERROR)
? ② 將新增的定時任務配置的時間,由2分鐘改為10秒后,定時任務能正常運行。
?
3.發現數據庫qrtz_scheduler_state(調度器狀態表)中,有很多條數據。表示有很多實例應用都在運行quartz。
?
經過這些測試和調查,發現是其它機器可能將新增的定時任務取走執行,但是其它機器上又沒有配置該新增定時任務,然后再調度該任務的時候就將數據庫qrtz_triggers(Trigger信息表)中,對應的任務數據的TRIGGER_STATE字段變為ERROR。
?
綜上所述,本地開發環境下,項目組成員使用同一數據庫進行開發時,每位開發人員在quartz中,配置的定時任務數量不一致。當應用服務啟動后,quartz任務調度器會根據數據庫qrtz_triggers(trigger信息表)中的數據執行Job,數據庫中已經存在新增的定時任務,而取走的應用服務quartz配置中并沒有配置該新增定時任務,執行時就將TRIGGER_STATE變為ERROR,導致新增Job不能正常執行。
?
建議:
使用quartz配置定時任務,多臺服務器使用同一數據庫進行開發時,保證數據庫qrtz_scheduler_state(任務調度表)中只有一條數據,這樣就能保證定時任務是自己的應用服務取走執行的。
總結
以上是生活随笔為你收集整理的集群环境下,谁偷走quartz配置的定时任务的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java贪吃蛇课程设计知乎_Java课程
- 下一篇: 计算机项目(毕设课设) 之 含文档+PP