【Quartz】Quartz的數據庫表


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";


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM