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