select * from test.QRTZ_TRIGGERS 觸發器表
select * from QRTZ_PAUSED_TRIGGER_GRPS 暫停的分組任務表
select * from QRTZ_LOCKS 鎖表
select * from QRTZ_JOB_DETAILS 任務表詳情((調度名字和分組和job名字唯一決定一個job))
select * from QRTZ_FIRED_TRIGGERS 任務執行詳情
[1]插入一個任務
1、先從LOCKS中獲取行級鎖,鎖標識(TRIGGER_ACCESS)
2、查看是否存在JOB_DETAILS,不存在保存
3、查看是否存在TRIGGERS
->判斷當前分組是否暫停PAUSED_TRIGGER_GRPS,或所有分組是否暫停。如暫停,TRIGGERS為PAUSED
->如果當前定時任務,不允許執行,則去FIRED_TRIGGERS里查詢其狀態。其狀態,為TRIGGERS的狀態。(當前TRIGGERS狀態不為WAITING和PAUSED,則返回當天狀態,如果)
4、保存TRIGGERS(保存的時候,其狀態很重要,依賴PAUSED_TRIGGER_GRPS,FIRED_TRIGGERS里的數據)
5、commit或roball
[2]一次觸發任務調度的計划
1、先從LOCKS中獲取行級鎖,鎖標識(TRIGGER_ACCESS)
2、訪問TRIGGERS,找出最近要執行的,且狀態為WAITING的觸發器列表。List(triggerName和triggerGroup),再遍歷逐個訪問TRIGGERS和JOB_DETAILS表
->修改TRIGGERS表記錄的狀態由WATING-ACQUIRED
->在FIRED_TRIGGERS表中插入新記錄,狀態為ACQUIRED
3、如果出現異常,根據FIRED_TRIGGERS表中的instanceName查詢出,所有的FIRED_TRIGGERS記錄,驗證剛才獲取的TRIGGERS列表中是否包含相同instanceName
4、釋放行級鎖,鎖標識(TRIGGER_ACCESS)
5、如果達到要執行任務的時間,在此獲取TRIGGER_ACCESS
6,根據要激活List<Triggers>,驗證每一條TRIGGERS的狀態是否為ACQUIRED(如果存在獲取當前狀態,如果不存在狀態為:DELETED)
->如果是,則繼續驗證JOB_DETAILS
->如果不是,返回null
7、驗證job,是否存在
8、修改FIRED_TRIGGERS的狀態:ACQUIRED->EXECUTING
--->如果修改驗證過程中有異常,則將TRIGGERS的狀態從ACQUIRED-->WATIING,並根據instanceName刪除FIRED_TRIGGERS里的記錄。
9、將TRIGGERS表的狀態:ACQUIRED->WATIING
10、釋放鎖
11、創建內存的JobRunShell,交給工作線程運行。
//等待
String STATE_WAITING = "WAITING";
//獲取
String STATE_ACQUIRED = "ACQUIRED";
//執行
String STATE_EXECUTING = "EXECUTING";
//完成
String STATE_COMPLETE = "COMPLETE";
//阻塞
String STATE_BLOCKED = "BLOCKED";
//錯誤
String STATE_ERROR = "ERROR";
//暫停
String STATE_PAUSED = "PAUSED";
//暫停阻塞
String STATE_PAUSED_BLOCKED = "PAUSED_BLOCKED";
//刪除
String STATE_DELETED = "DELETED";
//錯過
String STATE_MISFIRED = "MISFIRED";
