精通Quartz-03-Quartz數據庫表分析

Quartz的集羣部署方案在架構上是分佈式的,沒有負責集中管理的節點,各節點間不會直接通訊而是利用數據庫鎖的方式來實現集羣環境下進行併發控制,因此Quartz集羣化部署時必需要啓用持久化配置。

分佈式部署時須要保證各個節點的系統時間一致。mysql

Quartz默認提供了11張表,若是下載了quartz的源碼,相應的sql文件所在目錄爲quartz/quartz-core/src/main/resources/org/quartz/impl/jdbcjobstoresql


本文使用的是tables_mysql_innodb.sql文件,它顯示指定了使用innodb存儲引擎,另外一個tables_mysql.sql文件沒有指定具體的存儲引擎;本方將對這些張表作簡單介紹數據庫


前面6張都是關於各類triggers的信息,後面包括job,日程表,調度節點狀態,悲觀鎖等信息;相關表操做在類StdJDBCDelegate中,相關sql語句在StdJDBCConstants中;
架構

1.qrtz_blob_triggers  併發

用戶自定義的Trigger使用Blob類型進行trigger詳細信息的存儲(這樣設計,JobStore更容易通用),非自定義的Trigger不會存放在此表中;分佈式

Quartz提供的triggers包括:CronTrigger,CalendarIntervalTrigger, DailyTimeIntervalTrigger以及SimpleTrigger,這幾個trigger信息會保存在後面的幾張表中; spa

 2.qrtz_cron_triggers 設計

存儲CronTrigger的詳細信息,這也是咱們使用最多的觸發器, 包括cron表達式,時區信息等; Spring對應的封裝CronTriggerFactoryBean
cdn

3.qrtz_simple_triggersblog

存儲SimpleTrigger的詳細信息,  包括重複次數,重複間隔時間和已經執行的次數等

Spring對應的封裝SimpleTriggerFactoryBean

4.qrtz_simprop_triggers

存儲CalendarIntervalTrigger和DailyTimeIntervalTrigger兩種類型的觸發器

Spring沒有對應的封裝類,可能由於這兩種不經常使用,且基本上能夠用CronTrigger來實現

5.qrtz_triggers

存儲全部Trigger(包括自帶的4種Trigger和用戶自定義Trigger)的通用動態信息;隨着調度的觸發preFireTime,nextFireTime, triggerState等都會相應的跟着變化

6.qrtz_fired_triggers

存儲即將觸發或正在觸發的trigger相關信息,trigger隨着時間的推移狀態發生變化,直到最後trigger執行完成,從表中被刪除

7.qrtz_job_details

存儲jobDetails信息,相關信息在定義的時候指定,後續不會發生變化

8.qrtz_calendars

 Quartz爲咱們提供了日曆的功能,能夠本身定義多個時間段,能夠控制觸發器在這個時間段內不觸發或者觸發;實際使用中通常是用於定義多個不觸發的時間段,用於排除特殊日期,節假日等

系統提供6種類型:AnnualCalendar,CronCalendar,DailyCalendar,HolidayCalendar,MonthlyCalendar,WeeklyCalendar

9.qrtz_paused_trigger_grps

存儲已暫停的Trigger組的信息,批量暫停Trigger時用到,不經常使用。

10.qrtz_scheduler_state

開啓集羣功能時,存儲Scheduler實例名稱,檢查週期,各節點最後活躍時間等信息;Quartz集羣下的故障轉移就是藉助這個表來實現的

11.qrtz_locks

Quartz提供的鎖表,爲多個節點調度提供分佈式鎖,實現分佈式調度,默認有2個鎖:STATE_ACCESS 主要用在scheduler按期檢查是否有失效節點的時候,保證只有一個節點去檢查和處理;

TRIGGER_ACCESS 主要用在Trigger觸發和觸發完成的時候,保證只有一個節點去執行相應的邏輯, 固然也能夠經過配置讓Trigger在獲取任務時也加鎖

相關文章
相關標籤/搜索