一、概述
1、簡介
(1)、項目創立於1998年, 不間斷更新,活躍度高。
(2)、純Java設計,設計用於JavaSE、JavaEE, 方便集成於:JVM、JMI
(3)、官網
http://www.quartz-scheduler.org/
(4)、cron表達式輔助工具
http://www.cronmaker.com/
2、功能
(1)、核心概念
scheduler ---> 調度器
trigger ---> 觸發器
job ---> 調度任務對象
jobDetail ---> 調度任務描述
listener ---> 調度監聽
calendar ---> 調度時間點
(2)、支持集羣
org.quartz.jobStore.isClustered
(3)、支持任務恢復
requestsRecovery
3、示例
// (1)、通過SchedulerFactory構建Scheduler對象
Scheduler sched = sf.getScheduler();
// (2)、聲明 CronTrigger 觸發器
CronTrigger trigger = new CronTrigger("helloWorldTrigger", "cronGroup", "1/1 * * * * ?");
// (3)、聲明 JobDetail(將 job 等屬性賦值給JobDetail)
JobDetail job = new JobDetail("helloWorldJob", Scheduler.DEFAULT_GROUP, HelloWorldJob.class);
// (4)、工廠模式,組裝各個組件<JOB,Trigger>
sched.scheduleJob (job, trigger);
// (5)、start
sched.start();
4、流程圖
(1)、創建調度工廠 ---> 工廠模式
(2)、根據工廠取得調度器實例 ---> 工廠模式
(3)、Builder模式構建子組件<Job,Trigger> ---> builder模式, 如JobBuilder、TriggerBuilder、DateBuilder
(4)、通過調度器組裝子組件,調度器.組裝<子組件1,子組件2...> ---> 工廠模式
(5)、調度器.start ---> 工廠模式
二、入門(居於 Quartz 1.*)
1、目錄結構和內容
docs/api ---> Quartz 框架的JavaDoc Api 說明文檔
docs/dbTables ---> 創建 Quartz 的數據庫對象的腳本
docs/wikidocs ---> Quartz 的幫助文件,點擊 index.html 開始查看
Examples ---> 多方面使用 Quartz 的例子Lib Quartz 使用到的第三方包
src/java/org/quartz ---> 使用 Quartz 的客戶端程序源代碼,公有 API
src/java/org/quartz/core ---> 使用 Quartz 的服務端程序源代碼,私有 API
src/java/org/quartz/simpl ---> Quartz 提供的不衣賴於第三方產品的簡單實現
src/java/org/quartz/impl ---> 依賴於第三方產品的支持模塊的實現
src/java/org/quartz/utils ---> 整個框架要用到的輔助類和工具組件
注:Quartz 框架包含許多的類和接口,它們分佈在大概 11 個包中。多數所要使用到的類或接口放置在 org.quartz 包中。這個包含蓋了 Quartz 框架的公有 API.
2、Scheduler
(1)、作用
負責對用戶定義的所有任務進行調度的類
(2)、SchedulerFactory ---> 調度工廠
a、StdSchedulerFactory
Quartz默認的SchedulerFactory,依賴於屬性類(Properties)決定如何生產 Scheduler 實例
properties加載順序:
檢查 System.getProperty("org.quartz.properties") 中是否設置了別的文件名
使用 quartz.properties 作爲要加載的文件名
試圖從當前工作目錄中加載這個文件
試圖從系統 classpath 下加載這個文件
Quartz jar包中有一個默認的 quartz.properties 文件
b、DirectSchedulerFactory
對SchedulerFactory的直接實現, 通過它可以直接構建Scheduler、threadpool 等
-- 最簡單
public void createScheduler(ThreadPool threadPool, JobStore jobStore);
-- 最複雜
public void createScheduler(String schedulerName, String schedulerInstanceId,ThreadPool threadPool, JobStore jobStore, String rmiRegistryHost, int rmiRegistryPort);
(3)、Scheduler
a、啓動 Scheduler
scheduler.start();
b、銷燬 Scheduler
scheduler.shutdown();
c、StdScheduler
Quartz默認的Scheduler
d、RemoteScheduler
帶有RMI功能的Scheduler
3、Trigger
(1)、作用
描述觸發Job執行的時間觸發規則。
調度類(Scheduler)在 特定時間 調用此類,再由trigger類調用指定的定時程序。
(2)、SimpleTrigger
a、作用
用於按頻率調度 指定任務
b、常用屬性
jobDetail ---> 指定調度任務
repeatInterval ---> 指定間隔時間
repeatCount ---> 指定次數,默認無窮次
startDelay ---> 指定延遲多少毫秒啓動調度,默認立即
startTime ---> 指定某個時間點啓動調試,默認立即
(3)、CronTriggerBean
a、作用
用於按時間點調度 指定任務;使用Linux的Cron表達式 定義時間規則,Cron表達式由6或7個由空格分隔的時間字段組成
b、常用屬性
jobDetail ---> 指定調度任務
cronExpression ---> 指定重複執行的時間點
c、cron表達式
字段 允許值 允許的特殊字符
秒 0-59 , - * /
分 0-59 , - * /
小時 0-23 , - * /
日期 1-31 , - * ? / L W C
月份 1-12 或者 JAN-DEC , - * /
星期 1-7 或者 SUN-SAT , - * ? / L C #
年(可選) 留空, 1970-2099 , - * /
注:星期與日期不可同時指定。
d、cron特殊字符
* ---> 表示任意
? ---> 表示不設置
- ---> 表達一個範圍
, ---> 表達一個列表值
/ ---> x/y表達一個等步長序列,x爲起始值,y爲增量步長值
L ---> 該字符只在日期和星期字段中使用,代表“Last”的意思
W ---> 該字符只能出現在日期字段裏,表示離該日期最近的工作日
LW組合 ---> 在日期字段可以組合使用LW,它的意思是當月的最後一個工作日
# ---> 該字符只能在星期字段中使用,表示當月某個工作日: 6#3表示當月的第三個星期五(6表示星期五,#3表示當前的第三個)
C ---> 該字符只在日期和星期字段中使用,計劃所關聯的日期,如果日期沒有被關聯,則相當於日曆中所有日期: 5C在日期字段中就相當於日曆5日以後的第一天
(4)、其他 Trigger(不同版本有不同扣展)
DateIntervalTrigger ---> 日期間隔觸發的Trigger
4、JOB 接口 ---> 調度任務接口
(1)、作用
觸發器在被觸發後進行的操作,可以指定任意一個類的某個方法。
(2)、JobExecutionContext
JOB上下文,保存着Trigger、 JobDetail 等信息
(3)、定義的方法
public void execute(JobExecutionContext context) throws JobExecutionException;
(4)、JobDetail
a、作用
描述Job的實現類及其它相關的靜態信息。
b、原理(看參見 "一、3、(3)")
Quartz在每次執行Job時,都重新創建一個Job實例,所以它不直接接受一個Job的實例,相反它接收一個Job實現類,以便運行時通過newInstance()的反射機制實例化Job
c、作用
JobDetail不存儲Job的實例,但它允許你定義一個實例,JobDetail 又指向JobDataMap
JobDetail持有Job的詳細信息,如它所屬的組,名稱等信息
(4)、JobDataMap
a、作用
保存着任務實例的對象,並保持着他們狀態信息,它是Map接口的實現,即你可以往裏面put和get一些你想存儲和獲取的信息.
b、使用
JobDataMap jobDataMap = context.getJobDetail().getJobDataMap();
注: 在Quartz 1.5之後,JobDataMap在 Trigger 級也是可用的。
實際使用中trigger級別有時取不到map中的值, 使用getMergedJobDataMap 可以獲取到
(5)、StatefulJob
a、作用
代表有狀態的任務,該接口是一個沒有方法的標籤接口,其目的是讓Quartz知道任務的類型,以便採用不同的執行方案。
b、與Job的區分
無狀態任務在執行時擁有自己的JobDataMap拷貝,對JobDataMap的更改不會影響下次的執行。
有狀態任務共享同一個JobDataMap實例,每次任務執行對JobDataMap所做的更改會保存下來,後面的執行可以看到這個更改,也即每次執行任務後都會對後面的執行發生影響。
無狀態的Job可以併發執行,而有狀態的StatefulJob不能併發執行: 如果前次的StatefulJob還沒有執行完畢,下一次的任務將阻塞等待,直到前次任務執行完畢。
(6)、原生Job實現
org.quartz.jobs.FileScanJob ---> 檢查某個指定文件是否變化,並在文件被改變時通知到相應監聽器的 Job
org.quartz.jobs.FileScanListener ---> 在文件被修改後通知 FileScanJob 的監聽器
org.quartz.jobs.NativeJob ---> 用來執行本地程序(如 windows 下 .exe 文件) 的 Job
org.quartz.jobs.NoOpJob ---> 什麼也不做。一些用戶甚至僅僅用它來導致一個監聽器的運行
org.quartz.jobs.ee.mail.SendMailJob ---> 使用 JavaMail API 發送 e-mail 的 Job
org.quartz.jobs.ee.jmx.JMXInvokerJob ---> 調用 JMX bean 上的方法的 Job
org.quartz.jobs.ee.ejb.EJBInvokerJob ---> 用來調用 EJB 上方法的 Job
注:一個job可以對應多個Trgger , 一個Trigger只能對應一個job .
quartz學習一--入門
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章
SpringBoot實現多線程並發動態執行計劃任務
CarolLXW
2020-07-08 04:58:39
定時quartz CronExpression表達式
姚永强
2020-06-19 23:07:16
啓動mysql報錯:mysql.service: Service hold-off time over, scheduling restart
念念不忘的旧情人
2020-04-11 04:45:36
spring task實現動態定時任務
小葫芦-爬坑记
2019-03-06 12:50:49
SpringBoot 創建定時任務
java_代码搬运工
2018-09-03 15:47:15
quartz學習四--存儲、集羣
庄梦蝶殇
2018-08-30 19:46:35
quartz學習二--監聽、排除日期、線程
庄梦蝶殇
2018-08-30 19:46:35
quartz學習三--Spring集成
庄梦蝶殇
2018-08-30 19:46:35