Quartz框架(六)— Trigger狀態轉換

Quartz框架(一)—Quartz的基本配置
Quartz框架(二)—jobstore數據庫表字段詳解
Quartz框架(三)—任務的並行/串行執行
Quartz框架(四)—misfire處理機制
Quartz框架(五)— 有狀態的job和無狀態job
Quartz框架(六)— Trigger狀態轉換
Quartz框架(七)— Quartz集羣+實戰運用

在Quartz框架中,Trigger是一個重要的對象,定時任務的調度、觸發都是通過Trigger的操作來實現的。

Trigger按照類型的不同,可以劃分爲SIMPLE、CORN、BLOB等類型,數據庫中也有對應的表存儲。除此之外QRTZ_TRIGGERSQRTZ_FIRED_TRIGGERS是兩張存儲Trigger調度的表。

正常獲取、觸發任務執行的流程:

一個觸發器只能綁定一個Job,但是一個Job可以有多個觸發器

調度器線程執行的時候,首先從triggers表中獲取狀態爲WAITING,並且將要觸發的Trigger。然後將WAITING狀態更新爲ACQUIRED,表示該觸發器搶佔到了,防止其他調度器(實例)搶佔。然後插入觸發器信息以及實例名到FRIED_TRIGGERS表中,狀態爲ACQUIRED。前面的更新和後面的插入是在一個事務中進行的。

該觸發器搶佔到任務後,等待觸發時間的到來。

執行時間到來後,每觸發一次任務,都會在FIRED_TRIGGERS表中創建一條記錄,並且狀態爲EXECUTING。如果任務允許併發執行,此時TRIGGERS表裏的狀態更新爲WAITING,PAUSED,COMPLETE(不需要執行)。

如果任務不允許併發執行,還會把Triggers表裏的狀態更新爲BLOCK或PAUSED_BLOCK。

注意:Triggers表更新時根據 任務名和任務所屬組名 而不是 觸發器名稱和觸發器組名來更新的。這就解決了一個任務有多個觸發器的併發問題;然後觸發器線程會創建一個執行環境來執行任務,以便在任務執行完成後更新觸發器的狀態。任務執行完成後,在一個事務中觸發器狀態更新爲WAITING,刪除FIRED_TRIGGERS表裏對應的記錄。

文章參考

Quartz Trigger狀態轉換

Quartz blocked 線上故障解決

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章