筆記來源: IMOOC Java Quartz
Quartz 特色java
主要用到的設計模式git
Quartz 三個核心概念github
重要組成segmentfault
Trigger設計模式
Calendar框架
監聽器分佈式
execute
方法,相似 TimerTask
的 run
方法,在裏面編寫業務邏輯package org.quartz; public interface Job { void execute(JobExecutionContext context) throws JobExecutionException; }
Job 實例在 Quartz 中的生命週期函數
execute
方法前會建立一個新的 job 實例JobDetail
爲 Job 實例提供了許多設置屬性,以及 JobDataMap
成員變量屬性,它用來存儲特定 Job 實例的狀態信息,調度器須要藉助 JobDetail
對象來添加 Job 實例。工具
重要屬性ui
name
group
jobClass
jobDataMap
Scheduler
調用一個 Job,就會將 JobExecutionContext
傳遞給 Job 的 execute()
方法;JobExecutionContext
對象訪問到 Quartz 運行時候的環境以及 Job 自己的明細數據。JobDataMap
存儲在 JobExecutionContext
中,很是方便獲取。JobDataMap
能夠用來裝載任何可序列化的數據對象,當 job 實例對象被執行時這些參數對象會傳遞給它。JobDataMap
實現了JDK的Map接口,並添加了一些很是方便的方法用來存取基本數據類型。獲取 JobDataMap
的兩種方式
JobDataMap
的鍵值(Quartz 框架默認的 JobFactory
實現類在初始化 job 實例對象時會自動地調用這些 setter 方法)Trigger
對象是用來觸發執行 Job
的。觸發器通用屬性
JobKey
:表示 job 實例的標識,觸發器被觸發時,該指定的 job 實例會執行。StartTime
:表示觸發器的時間表首次被觸發的時間。它的值類型是 java.util.Date
。EndTime
:指定觸發器的再也不被觸發的時間。withRepeatCount
重複次數能夠是 0
,正整數或是 SimppleTrigger.REPEAT_INDEFINITELY
常量值。withIntervalInSeconds
等重複執行間隔必須爲 0
或 長整數 endTime
參數,那麼它會覆蓋重複次數參數的效果CronTrigger
的做用:基於日曆的做業調度器,而不是像 SimpleTrigger
那樣精確指定間隔時間,比SimpleTrigger
更經常使用。CronTrigger
實例;[秒] [分] [時] [日] [月] [周] [年]
字段 | 是否必填 | 容許值 | 容許特殊字符 |
---|---|---|---|
秒 | 是 | 0~59 | , - * / |
分 | 是 | 0~59 | , - * / |
時 | 是 | 0~23 | , - * / |
日 | 是 | 1~31 | , - * ? / L W C |
月 | 是 | 1~12 或 JAN~DEC | , - * / |
周 | 是 | 1~7 或 SUN~SAT | , - * ? / L C # |
年 | 否 | empty 1970~2099 | , - * / |
表達式 | 含義 |
---|---|
0 15 10 ? | 天天10點15分觸發 |
0 0/5 14 ? | 天天下午2點到2點59分(整點開始,每隔5分鐘觸發) |
0 15 10 ? * MON-FRI | 從週一到週五天天上午的10點15分觸發 |
0 15 10 ? * 6#3 | 每個月的第三週的星期五開始觸發 |
0 15 10 ? 6L 2018-2019 | 從2018年到2019年每個月最後一週的星期五10點15分觸發 |
0/5 14,18 * ? | 天天14:00:00~14:59:5五、18:00:00~18:59:55,每5秒觸發一次 |
特殊字符 | 含義 |
---|---|
* | 表示全部值。例如:在[分]的字段上設置 *,表示每一分鐘都會觸發 |
? | 表示不指定值。使用的場景爲不須要關係當前設置這個字段的值。例如:要在每個月的10號觸發一次,但不關心是周幾,全部須要將[周]設置爲 ?,具體設置爲 0 0 0 10 * ? |
- | 表示區間。例如:在[時]上設置 10-12,表示十、十一、12點都會觸發 |
, | 表示指定多個值。例如:在[周]上設置 MON,WED,FRI 表示周1、3、五觸發 |
/ | 用於遞增觸發。例如:在[秒]上設置 5/15 表示從5秒開始,每增15秒觸發(五、20、3五、50)。又如在[月]上設置 1/3,表示每個月1號開始,每隔三天觸發 |
L | 表示最後的意思。在[日]字段上設置,表示當月的最後一天;在[周]字段上表示星期六(7 或 SAT);若是在L前加上數字,則表示該數據的最後一個。例如在[周]上設置 6L,表示「本月的最後一個星期五」 |
W | 表示離指定日期最近那個工做日(週一至週五),例如在[日]字段上設置 15W,表示離每個月15號最近的那個工做日觸發。日光指定格式爲 1W,則表示每個月1號日後最近的工做日觸發。(W前只能設置具體的數字,不容許區間-) |
# | +序號(表示每個月的第幾個周幾),例如在[周]字段上設置 6#3 表示在每個月的第三個週六,注意若是指定 #5,正好第五週沒有周六,則不會觸發該配置。(#用在母親節和父親節再適合不過了) |
L
和 W
能夠組合使用全部的 Scheduler 實例應該由 SchedulerFactory
來建立
SchedulerFactory
- StdSchedulerFactory
SchedulerFactory
- DirectSchedulerFactory
SchedulerFactory sfact = new StdSchedulerFactory(); Scheduler scheduler = sfact.getScheduler(); DirectSchedulerFactory factory = DirectSchedulerFactory.getInstance(); Scheduler scheduler = factory.getScheduler();
Java.util.Properties
來建立和初始化 Quartz 調度器quartz.properties
中getScheduler
方法就能建立和初始化調度器對象Date scheduleJob(JobDetail jobDetail, Trigger trigger)
void start()
- 開始/繼續執行void standby()
- 掛起void shutdown()
shutdown(true)
表示等待全部正在執行的 job 執行完畢以後,再關閉 schedulershutdown(false)
即 shutdown()
表示直接關閉 scheduler若項目無 quartz.properties
,將會去 quartz.jar
包讀取默認 quartz.properties
。
調度器屬性
org.quartz.scheduler.instanceName
屬性用來區分調度器實例,能夠按功能用途來給調度器起名。org.quartz.scheduler.instanceId
屬性和前者同樣,也容許任何字符串,但這個值必須是在全部調度器實例中是惟一的,尤爲是在一個集羣當中,做爲集羣的惟一key。假如你想 Quartz 幫你生成這個值的話,能夠設置爲 AUTO
。線程池屬性
org.quartz.threadPool.threadCount
:指定線程數,至少爲1(無默認值)(通常設置爲1-100直接的整數合適)org.quartz.threadPool.threadPriority
:設置線程的優先級(最大爲java.lang.Thread.MAX_PRIORITY
10,最小爲Thread.MIN_PRIORITY
1,默認爲5)org.quartz.threadPool.class
:線程池的實現類(通常使用 SimpleThreadPool
可知足幾乎全部用戶的需求)做業存儲設置
插件配置
- 相關例子代碼:https://github.com/gcusky/lea...
- 較簡單的 Java 定時任務調度工具:Timer
- Akka 利用 Extension 集成 Quartz:akka-quartz-scheduler