Quartz將Job保存在數據庫中所需表的說明
QRTZ_CALENDARS 以 Blob 類型存儲 Quartz 的 Calendar 信息
QRTZ_CRON_TRIGGERS 存儲 Cron Trigger,包括 Cron表達式和時區信息
QRTZ_FIRED_TRIGGERS 存儲與已觸發的 Trigger 相關的狀態信息,以及相聯 Job的執行信息 QRTZ_PAUSED_TRIGGER_GRPS 存儲已暫停的 Trigger 組的信息
QRTZ_SCHEDULER_STATE 存儲少量的有關 Scheduler 的狀態信息,和別的 Scheduler實例(假如是用於一個集群中)
QRTZ_LOCKS 存儲程序的悲觀鎖的信息(假如使用了悲觀鎖)
QRTZ_JOB_DETAILS 存儲每一個已配置的 Job 的詳細信息
QRTZ_JOB_LISTENERS 存儲有關已配置的 JobListener 的信息
QRTZ_SIMPLE_TRIGGERS 存儲簡單的Trigger,包括重復次數,間隔,以及已觸的次數
QRTZ_BLOG_TRIGGERS Trigger 作為 Blob 類型存儲(用於 Quartz 用戶用 JDBC創建他們自己定制的 Trigger 類型,JobStore 並不知道如何存儲實例的時候)
QRTZ_TRIGGER_LISTENERS 存儲已配置的 TriggerListener 的信息
QRTZ_TRIGGERS 存儲已配置的 Trigger 的信息
quartz 持久化數據庫表格字段解釋
建表,SQL語句在quartz-1.6.6\docs\dbTables文件夾中可以找到,介紹下主要的幾張表:
表qrtz_job_details: 保存job詳細信息,該表需要用戶根據實際情況初始化
job_name:集群中job的名字,該名字用戶自己可以隨意定制,無強行要求
job_group:集群中job的所屬組的名字,該名字用戶自己隨意定制,無強行要求
job_class_name:集群中個note job實現類的完全包名,quartz就是根據這個路徑到classpath找到該job類
is_durable:是否持久化,把該屬性設置為1,quartz會把job持久化到數據庫中
job_data:一個blob字段,存放持久化job對象
表qrtz_triggers: 保存trigger信息
trigger_name: trigger的名字,該名字用戶自己可以隨意定制,無強行要求
trigger_group:trigger所屬組的名字,該名字用戶自己隨意定制,無強行要求
job_name: qrtz_job_details表job_name的外鍵
job_group: qrtz_job_details表job_group的外鍵
trigger_state:當前trigger狀態,設置為ACQUIRED,如果設置為WAITING,則job不會觸發
trigger_cron:觸發器類型,使用cron表達式
表qrtz_cron_triggers:存儲cron表達式表
trigger_name: qrtz_triggers表trigger_name的外鍵
trigger_group: qrtz_triggers表trigger_group的外鍵
cron_expression:cron表達式
表qrtz_scheduler_state:存儲集群中note實例信息,quartz會定時讀取該表的信息判斷集群中每個實例的當前狀態
instance_name:之前配置文件中org.quartz.scheduler.instanceId配置的名字,就會寫入該字段,如果設置為AUTO,quartz會根據物理機名和當前時間產生一個名字
last_checkin_time:上次檢查時間
checkin_interval:檢查間隔時間
配置quartz.properties文件:
#調度標識名 集群中每一個實例都必須使用相同的名稱 org.quartz.scheduler.instanceName = scheduler
#ID設置為自動獲取 每一個必須不同 org.quartz.scheduler.instanceId = AUTO
#數據保存方式為持久化 org.quartz.jobStore.class = org.quartz.impl.jdbcjobstore.JobStoreTX
#數據庫平台 org.quartz.jobStore.driverDelegateClass = org.quartz.impl.jdbcjobstore.oracle.weblogic.WebLogicOracleDelegate #數據庫別名 隨便取org.quartz.jobStore.dataSource = myXADS
#表的前綴 org.quartz.jobStore.tablePrefix = QRTZ_
#設置為TRUE不會出現序列化非字符串類到 BLOB 時產生的類版本問題 org.quartz.jobStore.useProperties = true
#加入集群 org.quartz.jobStore.isClustered = true
#調度實例失效的檢查時間間隔 org.quartz.jobStore.clusterCheckinInterval = 20000
#容許的最大作業延長時間 org.quartz.jobStore.misfireThreshold = 60000
#ThreadPool 實現的類名 org.quartz.threadPool.class = org.quartz.simpl.SimpleThreadPool
#線程數量 org.quartz.threadPool.threadCount = 10
#線程優先級 org.quartz.threadPool.threadPriority = 5
#自創建父線程 org.quartz.threadPool.threadsInheritContextClassLoaderOfInitializingThread = true
#設置數據源org.quartz.dataSource.myXADS.jndiURL = CT
#jbdi類名 org.quartz.dataSource.myXADS.java.naming.factory.initial = weblogic.jndi.WLInitialContextFactory #URLorg.quartz.dataSource.myXADS.java.naming.provider.url = t3://localhost:7001
注】:在J2EE工程中如果想用數據庫管理Quartz的相關信息,就一定要配置數據源,這是Quartz的要求。
---------------------
原文:https://blog.csdn.net/fly_captain/article/details/83058147
=============================================================================================================
前言
Quartz默認提供了11張表,本文將對這幾張表做簡要的分析。
表信息
共11張表,前6張都是關於各種triggers的信息,后面包括job,悲觀鎖,調度狀態等信息;相關表操作在類StdJDBCDelegate中,相關sql語句在StdJDBCConstants中;
1.qrtz_blob_triggers
自定義的triggers使用blog類型進行存儲,非自定義的triggers不會存放在此表中,Quartz提供的triggers包括:CronTrigger,CalendarIntervalTrigger,
DailyTimeIntervalTrigger以及SimpleTrigger,這幾個trigger信息會保存在后面的幾張表中;
2.qrtz_cron_triggers
存儲CronTrigger,這也是我們使用最多的觸發器,在配置文件中做如下配置,即可在qrtz_cron_triggers生成記錄:
表達式指定了每隔6秒執行一次,然后指定了要執行的task,task指定了要執行的業務,運行之后可以查看數據表:
myScheduler是在定義SchedulerFactoryBean時指定的名稱,其他字段都可以在上面的配置中找到;
3.qrtz_simple_triggers
存儲SimpleTrigger,在配置文件中做如下配置,即可在qrtz_simple_triggers生成記錄:
指定了開始延遲時間,重復間隔時間已經重復的次數限制,查看表如下:
TIMES_TRIGGERED用來記錄執行了多少次了,此值被定義在SimpleTriggerImpl中,每次執行+1,這里定義的REPEAT_COUNT=5,實際情況會執行6次,具體可以查看SimpleTriggerImpl源碼:
timesTriggered默認值為0,當timesTriggered > repeatCount停止trigger,所以會執行6次,當執行完畢之后此記錄會被刪除;
4.qrtz_simprop_triggers
存儲CalendarIntervalTrigger和DailyTimeIntervalTrigger兩種類型的觸發器,使用CalendarIntervalTrigger做如下配置:
CalendarIntervalTrigger沒有對應的FactoryBean,直接設置實現類CalendarIntervalTriggerImpl;指定的重復周期是1,默認單位是天,也就是每天執行一次,查看表如下:
提供了3個string類型的參數,2個int類型的參數,2個long類型的參數,2個decimal類型的參數以及2個boolean類型的參數;具體每個參數是什么含義,根據不同的trigger類型存放各自的參數;
5.qrtz_fired_triggers
存儲已經觸發的trigger相關信息,trigger隨着時間的推移狀態發生變化,直到最后trigger執行完成,從表中被刪除;已SimpleTrigger為例重復3次執行,查詢表:
相同的trigger和task,每觸發一次都會創建一個實例;從剛被創建的ACQUIRED狀態,到EXECUTING狀態,最后執行完從數據庫中刪除;
6.qrtz_triggers
存儲定義的trigger,以上定義的三個triggers為例,分別是:firstSimpleTrigger,firstCalendarTrigger和firstCronTrigger,運行之后查看數據庫:
和qrtz_fired_triggers存放的不一樣,不管trigger觸發了多少次都只有一條記錄,TRIGGER_STATE用來標識當前trigger的狀態;firstCalendarTask每天執行一次,執行完之后一直是WAITING狀態;firstCronTrigger每6秒執行一次狀態是ACQUIRED狀態;firstSimpleTrigger重復執行6次后狀態為COMPLETE,並且會被刪除;
7.qrtz_job_details
存儲jobDetails信息,相關信息在定義的時候指定,如上面定義的JobDetailFactoryBean,查詢數據庫:
JOB_DATA存放的就是定義task時指定的jobDataMap屬性,所以此屬性需要實現Serializable接口,方便持久化到數據庫;
8.qrtz_calendars
Quartz為我們提供了日歷的功能,可以自己定義一個時間段,可以控制觸發器在這個時間段內觸發或者不觸發;現在提供6種類型:AnnualCalendar,CronCalendar,DailyCalendar,HolidayCalendar,MonthlyCalendar,WeeklyCalendar;以下使用CronCalendar為例:
定義了一個排除每隔5秒的CronCalendar,然后在firstCronTrigger中指定了calendarName,並且需要在SchedulerFactoryBean中定義calendars;因為firstCronTrigger每6秒執行一次,而CronCalendar排除每隔5秒,所以會出現firstCronTrigger在第5次觸發的時候需要等待12秒,結果如下:
查詢保存在數據中的CronCalendar:
CALENDAR存放的是CronCalendar序列化之后的數據;
9.qrtz_paused_trigger_grps
存放暫停掉的觸發器,測試手動暫停firstCronTrigger,代碼如下:
啟動之后延遲4秒后暫停firstCronTrigger,這里傳遞的參數group,然后查看數據庫:
因為已經入庫,所以重啟之后firstCronGroup還是處於暫停狀態,firstCronTrigger不會運行;
10.qrtz_scheduler_state
存儲所有節點的scheduler,會定期檢查scheduler是否失效,啟動多個scheduler,查詢數據庫:
記錄了最后最新的檢查時間,在quartz.properties中設置了CHECKIN_INTERVAL為1000,也就是每秒檢查一次;
11.qrtz_locks
Quartz提供的鎖表,為多個節點調度提供分布式鎖,實現分布式調度,默認有2個鎖:
STATE_ACCESS主要用在scheduler定期檢查是否失效的時候,保證只有一個節點去處理已經失效的scheduler;
TRIGGER_ACCESS主要用在TRIGGER被調度的時候,保證只有一個節點去執行調度;
總結
本文對這11張表做了簡要的分析,介紹了每張表具體是用來存儲什么的,並且給了簡單的實例;其實如果要實現一個trigger的管理系統,其實也就是對這幾張表的維護。
---------------------
作者:小牛學堂666
來源:CSDN
原文:https://blog.csdn.net/xiaoniu_888/article/details/83181078
版權聲明:本文為博主原創文章,轉載請附上博文鏈接!