摘要:例如在周上設(shè)置表示周一三五觸發(fā)用于遞增觸發(fā)。例如在周上設(shè)置,表示本月的最后一個(gè)星期五表示離指定日期最近那個(gè)工作日周一至周五,例如在日字段上設(shè)置,表示離每月號(hào)最近的那個(gè)工作日觸發(fā)。相關(guān)例子代碼較簡(jiǎn)單的定時(shí)任務(wù)調(diào)度工具利用集成
筆記來源:IMOOC Java QuartzQuartz 簡(jiǎn)介
OpenSymphony 提供的強(qiáng)大的開源任務(wù)調(diào)度框架
純 Java 實(shí)現(xiàn),精細(xì)控制排程
Quartz 特點(diǎn)
強(qiáng)大的調(diào)度功能
靈活的應(yīng)用方式
分布式和集群能力
主要用到的設(shè)計(jì)模式
Builder 模式
Factory 模式
組件模式
鏈?zhǔn)綄懛?/p>
Quartz 三個(gè)核心概念
調(diào)度器
任務(wù)
觸發(fā)器
Quartz 體系結(jié)構(gòu)
重要組成
Job
JobDetail
JobBuilder
JobStore
Trigger
SimpleTrigger
CronTrigger
TriggerBuilder
ThreadPool
Scheduler
Calendar
一個(gè)Trigger 可以和多個(gè)Calendar 關(guān)聯(lián),以排除或包含某些時(shí)間點(diǎn)
監(jiān)聽器
JobListener
TriggerListener
SchedulerListener
淺談 JobJob 定義:實(shí)現(xiàn)業(yè)務(wù)邏輯的任務(wù)接口
Job 接口非常容易實(shí)現(xiàn),只有一個(gè) execute 方法,類似 TimerTask 的 run 方法,在里面編寫業(yè)務(wù)邏輯
package org.quartz; public interface Job { void execute(JobExecutionContext context) throws JobExecutionException; }
Job 實(shí)例在 Quartz 中的生命周期
每次調(diào)度器執(zhí)行 job 時(shí),它在調(diào)用 execute 方法前會(huì)創(chuàng)建一個(gè)新的 job 實(shí)例
當(dāng)調(diào)用完成后,關(guān)聯(lián)的 job 對(duì)象實(shí)例會(huì)被釋放,釋放的實(shí)例會(huì)被垃圾回收機(jī)制回收
淺談 JobDetailJobDetail 為 Job 實(shí)例提供了許多設(shè)置屬性,以及 JobDataMap 成員變量屬性,它用來存儲(chǔ)特定 Job 實(shí)例的狀態(tài)信息,調(diào)度器需要借助 JobDetail 對(duì)象來添加 Job 實(shí)例。
重要屬性
name
group
jobClass
jobDataMap
淺談 JobExecutionContext當(dāng) Scheduler 調(diào)用一個(gè) Job,就會(huì)將 JobExecutionContext 傳遞給 Job 的 execute() 方法;
Job 能通過 JobExecutionContext 對(duì)象訪問到 Quartz 運(yùn)行時(shí)候的環(huán)境以及 Job 本身的明細(xì)數(shù)據(jù)。
淺談 JobDataMap在進(jìn)行任務(wù)調(diào)度時(shí) JobDataMap 存儲(chǔ)在 JobExecutionContext 中,非常方便獲取。
JobDataMap 可以用來裝載任何可序列化的數(shù)據(jù)對(duì)象,當(dāng) job 實(shí)例對(duì)象被執(zhí)行時(shí)這些參數(shù)對(duì)象會(huì)傳遞給它。
JobDataMap 實(shí)現(xiàn)了JDK的Map接口,并添加了一些非常方便的方法用來存取基本數(shù)據(jù)類型。
獲取 JobDataMap 的兩種方式
從 Map 中直接獲取
Job 實(shí)現(xiàn)類中添加 setter 方法對(duì)應(yīng) JobDataMap 的鍵值(Quartz 框架默認(rèn)的 JobFactory 實(shí)現(xiàn)類在初始化 job 實(shí)例對(duì)象時(shí)會(huì)自動(dòng)地調(diào)用這些 setter 方法)
淺談 TriggerQuartz 中的觸發(fā)器用來告訴調(diào)度程序作業(yè)什么時(shí)候觸發(fā)。即 Trigger 對(duì)象是用來觸發(fā)執(zhí)行 Job 的。
觸發(fā)器通用屬性
JobKey:表示 job 實(shí)例的標(biāo)識(shí),觸發(fā)器被觸發(fā)時(shí),該指定的 job 實(shí)例會(huì)執(zhí)行。
StartTime:表示觸發(fā)器的時(shí)間表首次被觸發(fā)的時(shí)間。它的值類型是 java.util.Date。
EndTime:指定觸發(fā)器的不再被觸發(fā)的時(shí)間。
SimpleTrigger在一個(gè)指定時(shí)間段內(nèi)執(zhí)行一次作業(yè)任務(wù),或是在指定的時(shí)間間隔內(nèi)多次執(zhí)行作業(yè)任務(wù)。
withRepeatCount 重復(fù)次數(shù)可以是 0,正整數(shù)或是 SimppleTrigger.REPEAT_INDEFINITELY 常量值。
withIntervalInSeconds 等重復(fù)執(zhí)行間隔必須為 0 或 長整數(shù)
一旦被指定了 endTime 參數(shù),那么它會(huì)覆蓋重復(fù)次數(shù)參數(shù)的效果
CronTriggerCronTrigger 的作用:基于日歷的作業(yè)調(diào)度器,而不是像 SimpleTrigger 那樣精確指定間隔時(shí)間,比SimpleTrigger 更常用。
Cron 表達(dá)式用于配置 CronTrigger 實(shí)例;
是由7個(gè)表達(dá)式組成的字符串,描述了時(shí)間表的詳細(xì)信息;
格式:[秒] [分] [時(shí)] [日] [月] [周] [年]
Cron 特殊字符字段 | 是否必填 | 允許值 | 允許特殊字符 |
---|---|---|---|
秒 | 是 | 0~59 | , - * / |
分 | 是 | 0~59 | , - * / |
時(shí) | 是 | 0~23 | , - * / |
日 | 是 | 1~31 | , - * ? / L W C |
月 | 是 | 1~12 或 JAN~DEC | , - * / |
周 | 是 | 1~7 或 SUN~SAT | , - * ? / L C # |
年 | 否 | empty 1970~2099 | , - * / |
表達(dá)式 | 含義 |
---|---|
0 15 10 ? | 每天10點(diǎn)15分觸發(fā) |
0 0/5 14 ? | 每天下午2點(diǎn)到2點(diǎn)59分(整點(diǎn)開始,每隔5分鐘觸發(fā)) |
0 15 10 ? * MON-FRI | 從周一到周五每天上午的10點(diǎn)15分觸發(fā) |
0 15 10 ? * 6#3 | 每月的第三周的星期五開始觸發(fā) |
0 15 10 ? 6L 2018-2019 | 從2018年到2019年每月最后一周的星期五10點(diǎn)15分觸發(fā) |
0/5 14,18 * ? | 每天14:00:00~14:59:55、18:00:00~18:59:55,每5秒觸發(fā)一次 |
特殊字符 | 含義 |
---|---|
* | 表示所有值。例如:在[分]的字段上設(shè)置 *,表示每一分鐘都會(huì)觸發(fā) |
? | 表示不指定值。使用的場(chǎng)景為不需要關(guān)系當(dāng)前設(shè)置這個(gè)字段的值。例如:要在每月的10號(hào)觸發(fā)一次,但不關(guān)心是周幾,所有需要將[周]設(shè)置為 ?,具體設(shè)置為 0 0 0 10 * ? |
- | 表示區(qū)間。例如:在[時(shí)]上設(shè)置 10-12,表示10、11、12點(diǎn)都會(huì)觸發(fā) |
, | 表示指定多個(gè)值。例如:在[周]上設(shè)置 MON,WED,FRI 表示周一、三、五觸發(fā) |
/ | 用于遞增觸發(fā)。例如:在[秒]上設(shè)置 5/15 表示從5秒開始,每增15秒觸發(fā)(5、20、35、50)。又如在[月]上設(shè)置 1/3,表示每月1號(hào)開始,每隔三天觸發(fā) |
L | 表示最后的意思。在[日]字段上設(shè)置,表示當(dāng)月的最后一天;在[周]字段上表示星期六(7 或 SAT);如果在L前加上數(shù)字,則表示該數(shù)據(jù)的最后一個(gè)。例如在[周]上設(shè)置 6L,表示“本月的最后一個(gè)星期五” |
W | 表示離指定日期最近那個(gè)工作日(周一至周五),例如在[日]字段上設(shè)置 15W,表示離每月15號(hào)最近的那個(gè)工作日觸發(fā)。日光指定格式為 1W,則表示每月1號(hào)往后最近的工作日觸發(fā)。(W前只能設(shè)置具體的數(shù)字,不允許區(qū)間-) |
# | +序號(hào)(表示每月的第幾個(gè)周幾),例如在[周]字段上設(shè)置 6#3 表示在每月的第三個(gè)周六,注意如果指定 #5,正好第五周沒有周六,則不會(huì)觸發(fā)該配置。(#用在母親節(jié)和父親節(jié)再適合不過了) |
L 和 W 可以組合使用
周字段英文字母不區(qū)分大小寫,即MON和mon相同
利用工具,在線生成
淺談 Schedule Scheduler - 工廠模式
所有的 Scheduler 實(shí)例應(yīng)該由 SchedulerFactory 來創(chuàng)建
SchedulerFactory - StdSchedulerFactory
SchedulerFactory - DirectSchedulerFactory
Scheduler 的創(chuàng)建方式SchedulerFactory sfact = new StdSchedulerFactory(); Scheduler scheduler = sfact.getScheduler(); DirectSchedulerFactory factory = DirectSchedulerFactory.getInstance(); Scheduler scheduler = factory.getScheduler();StdSchedulerFactory
使用一組參數(shù) Java.util.Properties 來創(chuàng)建和初始化 Quartz 調(diào)度器
配置參數(shù)一般存儲(chǔ)再 quartz.properties 中
調(diào)用 getScheduler 方法就能創(chuàng)建和初始化調(diào)度器對(duì)象
Scheduler 的主要函數(shù)
Date scheduleJob(JobDetail jobDetail, Trigger trigger)
返回此后第一次執(zhí)行的時(shí)間
void start() - 開始/繼續(xù)執(zhí)行
void standby() - 掛起
void shutdown()
shutdown(true) 表示等待所有正在執(zhí)行的 job 執(zhí)行完畢之后,再關(guān)閉 scheduler
shutdown(false) 即 shutdown() 表示直接關(guān)閉 scheduler
quartz.properties 文檔的位置和加載順序若項(xiàng)目無 quartz.properties,將會(huì)去 quartz.jar 包讀取默認(rèn) quartz.properties。
組成部分
調(diào)度器屬性
org.quartz.scheduler.instanceName 屬性用來區(qū)分調(diào)度器實(shí)例,可以按功能用途來給調(diào)度器起名。
org.quartz.scheduler.instanceId 屬性和前者一樣,也允許任何字符串,但這個(gè)值必須是在所有調(diào)度器實(shí)例中是唯一的,尤其是在一個(gè)集群當(dāng)中,作為集群的唯一key。假如你想 Quartz 幫你生成這個(gè)值的話,可以設(shè)置為 AUTO。
線程池屬性
org.quartz.threadPool.threadCount:指定線程數(shù),至少為1(無默認(rèn)值)(一般設(shè)置為1-100直接的整數(shù)合適)
org.quartz.threadPool.threadPriority:設(shè)置線程的優(yōu)先級(jí)(最大為java.lang.Thread.MAX_PRIORITY 10,最小為Thread.MIN_PRIORITY 1,默認(rèn)為5)
org.quartz.threadPool.class:線程池的實(shí)現(xiàn)類(一般使用 SimpleThreadPool 可滿足幾乎所有用戶的需求)
作業(yè)存儲(chǔ)設(shè)置
描述了在調(diào)度器實(shí)例的生命周期中,Job 和 Trigger 信息是如何被存儲(chǔ)的。
插件配置
滿足特定需求用到的 Quartz 插件的配置。
相關(guān)例子代碼:https://github.com/gcusky/lea...
較簡(jiǎn)單的 Java 定時(shí)任務(wù)調(diào)度工具:Timer
Akka 利用 Extension 集成 Quartz:akka-quartz-scheduler
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/76422.html
本文來自網(wǎng)絡(luò)一些博客的整理(包括gong1208的博客 dary1715的博客) 1、簡(jiǎn)介 這個(gè)系列介紹Spring框架實(shí)現(xiàn)定時(shí)任務(wù)的兩種方式以及一些高級(jí)的用法,包括: 1、使用Quartz,這是一個(gè)功能比較強(qiáng)大的的調(diào)度器,可以讓你的程序在指定時(shí)間執(zhí)行,也可以按照某一個(gè)頻度執(zhí)行,配置起來稍顯復(fù)雜,稍后會(huì)詳細(xì)介紹。 2、Spring3.0以后自帶的task,可以將它看成一個(gè)輕量級(jí)的Quartz,而且...
摘要:定時(shí)任務(wù)間隔時(shí)間方式執(zhí)行一次定時(shí)任務(wù)線程休眠規(guī)定時(shí)間類類允許調(diào)度一個(gè)任務(wù)。引入依賴配置測(cè)試執(zhí)行一次定時(shí)任務(wù)使用注解是為定時(shí)任務(wù)而生的一個(gè)注解,查看注解的源碼表達(dá)式接收一個(gè)。 本文旨在用通俗的語言講述枯燥的知識(shí) 定時(shí)任務(wù)作為一種系統(tǒng)調(diào)度工具,在一些需要有定時(shí)作業(yè)的系統(tǒng)中應(yīng)用廣泛,如每逢某個(gè)時(shí)間點(diǎn)統(tǒng)計(jì)數(shù)據(jù)、在將來某個(gè)時(shí)刻執(zhí)行某些動(dòng)作...定時(shí)任務(wù)在主流開發(fā)語言均提供相應(yīng)的API供開發(fā)者調(diào)用...
摘要:時(shí)間年月日星期一說明本文部分內(nèi)容均來自慕課網(wǎng)。屬性任務(wù)名稱任務(wù)所屬組任務(wù)實(shí)現(xiàn)類傳參的作用淺談上是什么當(dāng)調(diào)用一個(gè),就會(huì)將傳遞給的方法能通過對(duì)象訪問到運(yùn)行時(shí)候的環(huán)境以及本身的明細(xì)數(shù)據(jù)。 時(shí)間:2017年06月26日星期一說明:本文部分內(nèi)容均來自慕課網(wǎng)。@慕課網(wǎng):http://www.imooc.com教學(xué)示例源碼:https://github.com/zccodere/s...個(gè)人學(xué)習(xí)源碼...
時(shí)間:2017年05月24日星期三說明:本文部分內(nèi)容均來自慕課網(wǎng)。@慕課網(wǎng):http://www.imooc.com教學(xué)示例源碼:無個(gè)人學(xué)習(xí)源碼:https://github.com/zccodere/s... 第一章:課程介紹 1-1 課程介紹 什么是定時(shí)任務(wù)調(diào)度 基于給定的時(shí)間點(diǎn),給定的時(shí)間間隔或者給定的執(zhí)行次數(shù)自動(dòng)執(zhí)行的任務(wù) 在Java中的定時(shí)調(diào)度工具 Timer:小弟,能實(shí)現(xiàn)日常60%的定...
摘要:類是一個(gè)抽象類,由安排為一次執(zhí)行或重復(fù)執(zhí)行的任務(wù)。也是自帶的一個(gè)基于線程池設(shè)計(jì)的定時(shí)任務(wù)類。問題,則可以直接使用類實(shí)現(xiàn)自定義的定時(shí)調(diào)度規(guī)則。 定時(shí)調(diào)度作為后端開發(fā)人員,我們總會(huì)遇到這樣的業(yè)務(wù)場(chǎng)景:每周同步一批數(shù)據(jù);每半個(gè)小時(shí)檢查一遍服務(wù)器運(yùn)行狀況;每天早上八點(diǎn)給用戶發(fā)送一份包含今日待辦事項(xiàng)的郵件,等等。 這些場(chǎng)景中都離不開定時(shí)器,就像一個(gè)定好時(shí)間規(guī)則的鬧鐘,它會(huì)在指定時(shí)間觸發(fā),執(zhí)行我們...
閱讀 1119·2021-11-23 09:51
閱讀 1086·2021-10-18 13:31
閱讀 2999·2021-09-22 16:06
閱讀 4290·2021-09-10 11:19
閱讀 2209·2019-08-29 17:04
閱讀 439·2019-08-29 10:55
閱讀 2489·2019-08-26 16:37
閱讀 3384·2019-08-26 13:29