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