Quartz數據庫表分析

前言

Quartz默認提供了11張表,本文將對這幾張表做簡要的分析。

表信息

共11張表,前6張都是關于各種triggers的信息,后面包括job,悲觀鎖,調度狀態(tài)等信息;相關表操作在類StdJDBCDelegate中,相關sql語句在StdJDBCConstants中;

1.qrtz_blob_triggers

自定義的triggers使用blog類型進行存儲,非自定義的triggers不會存放在此表中,Quartz提供的triggers包括:CronTrigger,CalendarIntervalTrigger,

DailyTimeIntervalTrigger以及SimpleTrigger,這幾個trigger信息會保存在后面的幾張表中;

2.qrtz_cron_triggers

存儲CronTrigger,這也是我們使用最多的觸發(fā)器,在配置文件中做如下配置,即可在qrtz_cron_triggers生成記錄:

表達式指定了每隔6秒執(zhí)行一次,然后指定了要執(zhí)行的task,task指定了要執(zhí)行的業(yè)務,運行之后可以查看數據表:

myScheduler是在定義SchedulerFactoryBean時指定的名稱,其他字段都可以在上面的配置中找到;

3.qrtz_simple_triggers

存儲SimpleTrigger,在配置文件中做如下配置,即可在qrtz_simple_triggers生成記錄:

指定了開始延遲時間,重復間隔時間已經重復的次數限制,查看表如下:

TIMES_TRIGGERED用來記錄執(zhí)行了多少次了,此值被定義在SimpleTriggerImpl中,每次執(zhí)行+1,這里定義的REPEAT_COUNT=5,實際情況會執(zhí)行6次,具體可以查看SimpleTriggerImpl源碼:

timesTriggered默認值為0,當timesTriggered > repeatCount停止trigger,所以會執(zhí)行6次,當執(zhí)行完畢之后此記錄會被刪除;

4.qrtz_simprop_triggers

存儲CalendarIntervalTrigger和DailyTimeIntervalTrigger兩種類型的觸發(fā)器,使用CalendarIntervalTrigger做如下配置:

CalendarIntervalTrigger沒有對應的FactoryBean,直接設置實現類CalendarIntervalTriggerImpl;指定的重復周期是1,默認單位是天,也就是每天執(zhí)行一次,查看表如下:

提供了3個string類型的參數,2個int類型的參數,2個long類型的參數,2個decimal類型的參數以及2個boolean類型的參數;具體每個參數是什么含義,根據不同的trigger類型存放各自的參數;

5.qrtz_fired_triggers

存儲已經觸發(fā)的trigger相關信息,trigger隨著時間的推移狀態(tài)發(fā)生變化,直到最后trigger執(zhí)行完成,從表中被刪除;已SimpleTrigger為例重復3次執(zhí)行,查詢表:

相同的trigger和task,每觸發(fā)一次都會創(chuàng)建一個實例;從剛被創(chuàng)建的ACQUIRED狀態(tài),到EXECUTING狀態(tài),最后執(zhí)行完從數據庫中刪除;

6.qrtz_triggers

存儲定義的trigger,以上定義的三個triggers為例,分別是:firstSimpleTrigger,firstCalendarTrigger和firstCronTrigger,運行之后查看數據庫:

和qrtz_fired_triggers存放的不一樣,不管trigger觸發(fā)了多少次都只有一條記錄,TRIGGER_STATE用來標識當前trigger的狀態(tài);firstCalendarTask每天執(zhí)行一次,執(zhí)行完之后一直是WAITING狀態(tài);firstCronTrigger每6秒執(zhí)行一次狀態(tài)是ACQUIRED狀態(tài);firstSimpleTrigger重復執(zhí)行6次后狀態(tài)為COMPLETE,并且會被刪除;

7.qrtz_job_details

存儲jobDetails信息,相關信息在定義的時候指定,如上面定義的JobDetailFactoryBean,查詢數據庫:

JOB_DATA存放的就是定義task時指定的jobDataMap屬性,所以此屬性需要實現Serializable接口,方便持久化到數據庫;

8.qrtz_calendars

Quartz為我們提供了日歷的功能,可以自己定義一個時間段,可以控制觸發(fā)器在這個時間段內觸發(fā)或者不觸發(fā);現在提供6種類型:AnnualCalendar,CronCalendar,DailyCalendar,HolidayCalendar,MonthlyCalendar,WeeklyCalendar;以下使用CronCalendar為例:

定義了一個排除每隔5秒的CronCalendar,然后在firstCronTrigger中指定了calendarName,并且需要在SchedulerFactoryBean中定義calendars;因為firstCronTrigger每6秒執(zhí)行一次,而CronCalendar排除每隔5秒,所以會出現firstCronTrigger在第5次觸發(fā)的時候需要等待12秒,結果如下:

查詢保存在數據中的CronCalendar:

CALENDAR存放的是CronCalendar序列化之后的數據;

9.qrtz_paused_trigger_grps

存放暫停掉的觸發(fā)器,測試手動暫停firstCronTrigger,代碼如下:

啟動之后延遲4秒后暫停firstCronTrigger,這里傳遞的參數group,然后查看數據庫:

因為已經入庫,所以重啟之后firstCronGroup還是處于暫停狀態(tài),firstCronTrigger不會運行;

10.qrtz_scheduler_state

存儲所有節(jié)點的scheduler,會定期檢查scheduler是否失效,啟動多個scheduler,查詢數據庫:

記錄了最后最新的檢查時間,在quartz.properties中設置了CHECKIN_INTERVAL為1000,也就是每秒檢查一次;

11.qrtz_locks

Quartz提供的鎖表,為多個節(jié)點調度提供分布式鎖,實現分布式調度,默認有2個鎖:

STATE_ACCESS主要用在scheduler定期檢查是否失效的時候,保證只有一個節(jié)點去處理已經失效的scheduler;

TRIGGER_ACCESS主要用在TRIGGER被調度的時候,保證只有一個節(jié)點去執(zhí)行調度;

總結

本文對這11張表做了簡要的分析,介紹了每張表具體是用來存儲什么的,并且給了簡單的實例;其實如果要實現一個trigger的管理系統(tǒng),其實也就是對這幾張表的維護。

?著作權歸作者所有,轉載或內容合作請聯系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

  • 說起《明朝那些事兒》,我想大家一定都不陌生。作者用詼諧幽默的語言,把原本枯燥無味的歷史寫的妙趣橫生。連我這...
    載馳閱讀 463評論 0 0
  • 我來自一個四線的城市,我們這里練摩拜ofo都沒。這次出門旅行回來途徑鄭州,哇!共享汽車都有了。有時間多出門走走看看...
    風輕晚閱讀 238評論 0 0
  • 早就聽過很多人推薦《金剛能斷》這本書了,它的豆瓣評分也高達9.0。前幾周還參加了格西老師的分享會,感覺還是挺有收獲...
    有才有閑閱讀 531評論 0 0
  • 第一天用簡書,隨便寫寫玩,你們也可以隨便聊聊。
    智商不在線閱讀 77評論 0 0

友情鏈接更多精彩內容