集群環境下,誰偷走quartz配置的定時任務

2021-09-01 23:35:21 字數 1638 閱讀 8210

錯誤現象:

在本地開發環境中,應用服務啟動後

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

(任務排程表)中只有一條資料,這樣就能保證定時任務是自己的應用服務取走執行的。

osgi環境下 quartz集群方案

首先是osgi環境要ok,可以參考之前的部落格 然後是quartz集群方案,這個比較繞 最後是兩者的結合,這個很蛋疼,基礎不牢,搞了我一周 背景 集群環境下,quartz的任務會在每個節點上同時執行,這就亂套了,如果涉及到寫資料庫,還可能造成更大的麻煩,所以quartz在集群環境下需要考慮特殊解決方...

在Spring 下配置Quartz集群

由於專案將要上線,而專案中的quartz集群配置一直沒時間弄,本以為應該是一件挺簡單的事,沒想到gooble了一兩天才解決問題,主要是因為spring到3.0.7這個版本為止都沒有原生支援quartz的集群,原來的quartz配置在單例項下執行正常,配置集群之後各種異常都來了,今天終於配置成功,在這...

UltraEdit環境下,php簡單環境配置

1 語法高亮 選單 檢視 檢視方式 選中 php 2 自動補全 選單 高階 配置 自動完成 選中 自動顯示自動完成對話方塊 字元數選擇2 3為宜 3 php除錯 選單 高階 工具配置 插入 命令 選單項名稱 php除錯 命令列 選擇php cgi.exe所在目錄,並在最後 空格 f,如 e wamp...