Quartzhtml
林老師帶你學編程:https://blog.csdn.net/linzhiqiang0316/article/details/80588313?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task 乾貨!!!java
靈感:https://www.cnblogs.com/davidwang456/p/3858980.html數據庫
Quartz提供了JobExecutionContext上下文經過JobDataMap傳遞數據。編程
代碼文件併發 |
功能要點框架 |
|
設置數據分佈式 |
QuartzConfig.java工具 |
建立JobDetail或者Trigger時,調用usingJobData()設置數據ui |
讀取數據url |
QuartzJob.java |
執行任務時,調用JobExecutionContext.getMergedJobDataMap()獲取數據 |
Quartz是Java領域最著名的開源任務調度工具,是一個任務調度框架,經過觸發器設置做業的定時運行規則,來執行定時任務。其中quartz集羣經過故障切換和負載平衡的功能,能給調度器帶來高可用性和伸縮性。
Quartz提供了極爲普遍的特性如持久化任務,集羣和分佈式任務等
Quartz框架主要核心組件包括:
1.Scheduler任務調度
是最核心的概念,須要把JobDetail和Trigger註冊到scheduler中,才能夠執行。
工廠模式,組裝各個組件 sched.scheduleJob(job, trigger);
2.Job任務,JobExecutionContext類提供調度上下文的各類信息
其實Job是接口,其中只有一個execute方法,咱們只須要 implements 此接口,重寫 execute(*) 方法。
實現Job接口的類還可使用註解進行修飾
@DisallowConcurrentExecution:此註解表示不容許這個Job併發執行
@PersistJobDataAfterExecution:此註解表示當這個Job的execute方法執行成功後,更新並存儲它所持有的JobDetail屬性中JobDataMap。若是使用這個註解,強烈建議也使用@DisallowConcurrentExecution,由於併發執行過程當中,JobDataMap有可能會發生衝突。
3.Trigger觸發器/TruggerBuilder(建立Trigger)/ThreadPool(線程)
執行任務的規則;好比天天,每小時等。
通常狀況使用SimpleTrigger,和CronTrigger,這些觸發器實現了Trigger接口。或者 ScheduleBuilder 子類 SimpleScheduleBuilder和CronScheduleBuilder。
對於簡單的時間來講,好比天天執行幾回,使用SimpleTrigger。
對於複雜的時間表達式來講,好比每月15日上午幾點幾分,使用CronTrigger以及CromExpression 類。
Priority:這個屬性表示Trigger的權重。當兩個Trigger觸發時間相同時,權重大的那個先執行。Quartz默認的權重值爲5。
Misfire Instruction:在Trigger接口中能夠設置錯過觸發處理機制
4.JobDetail任務細節/JobBuilder(建立JobDetail)/JobStore保存Job數據:保存內存或數據庫中)/JobDataMap:JSON數據格式
任務細節,Quartz執行Job時,須要新建個Job實例,可是不能直接操做Job類,因此經過JobDetail來獲取Job的名稱、描述信息。
JobDetail有兩個boolean屬性。
isDurable:若是設爲false,則對應的Job一旦沒有關聯的觸發器,就會被Scheduler自動刪除。 requestsRecovery:若是設爲true,當Job執行中遇到硬中斷(例如運行崩潰、機器斷電等),Scheduler會從新執行。這種狀況下,
JobExecutionContext.isRecovering()會返回ture。
5.Calendar(排除某個任務不執行)
一個Trigger能夠和多個Calendar關聯
6.監聽器JobListener TriggerListener SchedulerListener
7.JobKey 和 TriggerKey
在Quartz中,能夠分別經過JobKey和TriggerKey來惟一地識別一個Job或一個Trigger。
這兩個Key都有兩個關鍵屬性:name和group。
調度器做爲做業的總指揮,觸發器做爲做業的操做者,做業爲應用的功能模塊。
CronExpression表達式
CronTrigger配置完整但是爲:[秒] [分] [小時] [日] [月] [周] [年](年可選)
* 表示全部值
? 表示不指定值,例如:要在每個月的10號觸發一個操做,但不關心是周幾,因此須要周位置的那個字段設置爲"?" 具體設置爲 0 0 0 10 * ?
- 表示區間, 例如在小時上設置 "10-12",表示 10,11,12點都會觸發。
/用於遞增觸發,例如在秒上面設置"5/15"表示從5秒開始,每增15秒觸發(5,20,35,50)。在月字段上設置'1/3'所示每個月1號開始,每隔三天觸發一次
L 表示最後的意思, 例如在日字段設置上,表示當月的最後一天(依據當前月份,若是是二月還會依據是不是潤年[leap]), 在周字段上表示星期六,至關於"7"或"SAT"。若是在"L"前加上數字,則表示該數據的最後一個。例如在周字段上設置"6L"這樣的格式,則表示「本月最後一個星期五"
W 表示離指定日期的最近那個工做日(週一至週五)
例如在日字段上設置"15W",表示離每個月15號最近的那個工做日觸發。若是15號正好是週六,則找最近的週五(14號)觸發, 若是15號是周未,則找最近的下週一(16號)觸發。若是15號正好在工做日(週一至週五),則就在該天觸發。若是指定格式爲 "1W",它則表示每個月1號日後最近的工做日觸發。若是1號正是週六,則將在3號下週一觸發。(注,"W"前只能設置具體的數字,不容許區間"-")。
小提示:'L'和 'W'能夠一組合使用。若是在日字段上設置"LW",則表示在本月的最後一個工做日觸發;周字段的設置,若使用英文字母是不區分大小寫的,即MON與mon相同。
# 表示 每個月的第幾個周幾
例如在周字段上設置"6#3"表示在每個月的第三個週六。注意若是指定"#5",正好第五週沒有周六,則不會觸發該配置(用在母親節和父親節再合適不過了)。
注:表中月份一行的JAN-DEC,是指一月到十二月的英文縮寫;星期一行的SUN-SAT,是指星期天到星期六的英文縮寫。
表達式案例
在Quartz中有兩類線程模型:
1.Scheduler調度線程:QuartzSchedulerThread調度主線程QuartzScheduler被建立時建立一個QuartzSchedulerThread實例。
2.任務執行線程:任務執行線程Quartz不會在主線程(QuartzSchedulerThread)中處理用戶的Job。