quartz集群模式下qrtz_triggers表trigger_state变ERROR分析
最近在正式環境新增了一個定時任務,項目啟動后,新增的任務總是跑一兩次就不跑了,排查發現trigger_state變為ERROR了。
一、Quartz重要表含義
1)qrtz_calendars:以Blob類型存儲Quartz的Calendar日歷信息, quartz可配置一個日歷來指定一個時間范圍。
2)qrtz_cron_triggers:存儲Cron Trigger,包括Cron表達式和時區信息。
3)qrtz_fired_triggers:存儲已經觸發的trigger相關信息,trigger隨著時間的推移狀態發生變化,直到最后trigger執行完成,從表中被刪除。
4)qrtz_job_details:存儲每一個已配置的Job的詳細信息。
5)qrtz_scheduler_state:存儲少量的有關 Scheduler的狀態信息,和別的 Scheduler 實例(假如是用于一個集群中)。
6)qrtz_simple_triggers:存儲簡單的 Trigger,包括重復次數,間隔,以及已觸的次數。
7)qrtz_triggers:存儲已配置的 Trigger的信息。
二、任務查詢
查詢qrtz_job_details、qrtz_triggers、qrtz_cron_triggers這三張表即可查到對應定時任務信息。
三、原因分析
1、任務啟動后可以正常跑完一次,且在測試時代碼正常運行,說明代碼是沒有問題的;
2、通過更改qrtz_triggers表trigger_state狀態為WAITING和next_fire_time(下次觸發時間)讓任務執行后,一段時間后,trigger_state又變成ERROR,且只有新增任務式這樣,其他定時任務都可以正常跑,確定問題出在新的任務上;
3、檢查qrtz_scheduler_state表查看是否存在多條記錄,如果有多條,只留一條;
4、檢查集群環境,或者查看是否有其他環境也和正式環境共用一個數據庫,檢查后發現,有個備用服務器,并未配置負載均衡,但是用的是正式數據庫且上面的應用為啟動狀態,檢查服務器上部署的應用發現服務器上的包并未更新,這個包并不包含新增的任務,關掉備用服務器,發現正式環境上的任務可以正常運行了。
注:
查看任務下次觸發時間
問題總結:
使用quartz集群模式時,若集群節點中應用服務器打的包版本不一致或者其他服務器用非最新版本包且與正式環境共用一個數據庫時,就會出現qrtz_triggers表trigger_state變ERROR情況,從而導致定時任務不能正常運行。究其原因quartz執行任務調度是根據數據庫表中的記錄執行的,如果執行到沒有對應代碼的節點時,trigger_state就會變成ERROR。
總結
以上是生活随笔為你收集整理的quartz集群模式下qrtz_triggers表trigger_state变ERROR分析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 18-Jenkisn-Pipelin-声
- 下一篇: 论文笔记:Universal Adver