Quartz任務調度學習

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。

 

代碼實踐參考:https://www.cnblogs.com/jingmoxukong/p/5647869.html

相關文章
相關標籤/搜索