【Java定時任務調度工具】Quartz

筆記來源: IMOOC Java Quartz

Quartz 簡介

  • OpenSymphony 提供的強大的開源任務調度框架
  • 純 Java 實現,精細控制排程
  • Quartz 特色java

    • 強大的調度功能
    • 靈活的應用方式
    • 分佈式和集羣能力
  • 主要用到的設計模式git

    • Builder 模式
    • Factory 模式
    • 組件模式
    • 鏈式寫法
  • Quartz 三個核心概念github

    • 調度器
    • 任務
    • 觸發器

Quartz 核心

Quartz 體系結構

Quartz 體系

  • 重要組成segmentfault

    • Job
    • JobDetail
    • JobBuilder
    • JobStore
    • Trigger設計模式

      • SimpleTrigger
      • CronTrigger
    • TriggerBuilder
    • ThreadPool
    • Scheduler
    • Calendar框架

      • 一個Trigger 能夠和多個Calendar 關聯,以排除或包含某些時間點
    • 監聽器分佈式

      • JobListener
      • TriggerListener
      • SchedulerListener

Quartz 結構

淺談 Job

  • Job 定義:實現業務邏輯的任務接口
  • Job 接口很是容易實現,只有一個 execute 方法,相似 TimerTaskrun 方法,在裏面編寫業務邏輯
package org.quartz;
public interface Job {
    void execute(JobExecutionContext context) throws JobExecutionException;
}
  • Job 實例在 Quartz 中的生命週期函數

    • 每次調度器執行 job 時,它在調用 execute 方法前會建立一個新的 job 實例
    • 當調用完成後,關聯的 job 對象實例會被釋放,釋放的實例會被垃圾回收機制回收

淺談 JobDetail

JobDetail 爲 Job 實例提供了許多設置屬性,以及 JobDataMap 成員變量屬性,它用來存儲特定 Job 實例的狀態信息,調度器須要藉助 JobDetail 對象來添加 Job 實例。工具

  • 重要屬性ui

    • name
    • group
    • jobClass
    • jobDataMap

淺談 JobExecutionContext

  • Scheduler 調用一個 Job,就會將 JobExecutionContext 傳遞給 Job 的 execute() 方法;
  • Job 能經過 JobExecutionContext 對象訪問到 Quartz 運行時候的環境以及 Job 自己的明細數據。

淺談 JobDataMap

  • 在進行任務調度時 JobDataMap 存儲在 JobExecutionContext 中,很是方便獲取。
  • JobDataMap 能夠用來裝載任何可序列化的數據對象,當 job 實例對象被執行時這些參數對象會傳遞給它。
  • JobDataMap 實現了JDK的Map接口,並添加了一些很是方便的方法用來存取基本數據類型
  • 獲取 JobDataMap 的兩種方式

    • 從 Map 中直接獲取
    • Job 實現類中添加 setter 方法對應 JobDataMap 的鍵值(Quartz 框架默認的 JobFactory 實現類在初始化 job 實例對象時會自動地調用這些 setter 方法)

淺談 Trigger

  • Quartz 中的觸發器用來告訴調度程序做業何時觸發。即 Trigger 對象是用來觸發執行 Job 的。
  • 觸發器通用屬性

    • JobKey:表示 job 實例的標識,觸發器被觸發時,該指定的 job 實例會執行。
    • StartTime:表示觸發器的時間表首次被觸發的時間。它的值類型是 java.util.Date
    • EndTime:指定觸發器的再也不被觸發的時間。

SimpleTrigger

  • 在一個指定時間段執行一次做業任務,或是在指定的時間間隔屢次執行做業任務。
  • withRepeatCount 重複次數能夠是 0正整數或是 SimppleTrigger.REPEAT_INDEFINITELY 常量值。
  • withIntervalInSeconds 等重複執行間隔必須爲 0長整數
  • 一旦被指定了 endTime 參數,那麼它會覆蓋重複次數參數的效果

CronTrigger

  • CronTrigger 的做用:基於日曆做業調度器,而不是像 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 , - * /

Cron 表達式舉例

表達式 含義
0 15 10 ? 天天10點15分觸發
0 0/5 14 ? 天天下午2點到2點59分(整點開始,每隔5分鐘觸發)
0 15 10 ? * MON-FRI 從週一到週五天天上午的10點15分觸發
0 15 10 ? * 6#3 每個月的第三週的星期五開始觸發
0 15 10 ? 6L 2018-2019 從2018年到2019年每個月最後一週的星期五10點15分觸發
0/5 14,18 * ? 天天14:00:00~14:59:5五、18:00:00~18:59:55,每5秒觸發一次

Cron 通配符說明

特殊字符 含義
* 表示全部值。例如:在[分]的字段上設置 *,表示每一分鐘都會觸發
? 表示不指定值。使用的場景爲不須要關係當前設置這個字段的值。例如:要在每個月的10號觸發一次,但不關心是周幾,全部須要將[周]設置爲 ?,具體設置爲 0 0 0 10 * ?
- 表示區間。例如:在[時]上設置 10-12,表示十、十一、12點都會觸發
, 表示指定多個值。例如:在[周]上設置 MON,WED,FRI 表示周1、3、五觸發
/ 用於遞增觸發。例如:在[秒]上設置 5/15 表示從5秒開始,每增15秒觸發(五、20、3五、50)。又如在[月]上設置 1/3,表示每個月1號開始,每隔三天觸發
L 表示最後的意思。在[日]字段上設置,表示當月的最後一天;在[周]字段上表示星期六(7 或 SAT);若是在L前加上數字,則表示該數據的最後一個。例如在[周]上設置 6L,表示「本月的最後一個星期五」
W 表示離指定日期最近那個工做日(週一至週五),例如在[日]字段上設置 15W,表示離每個月15號最近的那個工做日觸發。日光指定格式爲 1W,則表示每個月1號日後最近的工做日觸發。(W前只能設置具體的數字,不容許區間-)
# +序號(表示每個月的第幾個周幾),例如在[周]字段上設置 6#3 表示在每個月的第三個週六,注意若是指定 #5,正好第五週沒有周六,則不會觸發該配置。(#用在母親節和父親節再適合不過了)
  • LW 能夠組合使用
  • 周字段英文字母不區分大小寫,即MON和mon相同
  • 利用工具,在線生成

淺談 Schedule

Scheduler - 工廠模式

  • 全部的 Scheduler 實例應該由 SchedulerFactory 來建立

    • SchedulerFactory - StdSchedulerFactory
    • SchedulerFactory - DirectSchedulerFactory

Scheduler 的建立方式

SchedulerFactory sfact = new StdSchedulerFactory();
Scheduler scheduler = sfact.getScheduler();

DirectSchedulerFactory factory = DirectSchedulerFactory.getInstance();
Scheduler scheduler = factory.getScheduler();

StdSchedulerFactory

  • 使用一組參數 Java.util.Properties 來建立和初始化 Quartz 調度器
  • 配置參數通常存儲再 quartz.properties
  • 調用 getScheduler 方法就能建立和初始化調度器對象

Scheduler 的主要函數

  • Date scheduleJob(JobDetail jobDetail, Trigger trigger)

    • 返回此後第一次執行的時間
  • void start() - 開始/繼續執行
  • void standby() - 掛起
  • void shutdown()

    • shutdown(true) 表示等待全部正在執行的 job 執行完畢以後,再關閉 scheduler
    • shutdown(false)shutdown() 表示直接關閉 scheduler

quartz.properties

文檔的位置和加載順序

若項目無 quartz.properties,將會去 quartz.jar 包讀取默認 quartz.properties

組成部分

  • 調度器屬性

    • org.quartz.scheduler.instanceName 屬性用來區分調度器實例,能夠按功能用途來給調度器起名。
    • org.quartz.scheduler.instanceId 屬性和前者同樣,也容許任何字符串,但這個值必須是在全部調度器實例中是惟一的,尤爲是在一個集羣當中,做爲集羣的惟一key。假如你想 Quartz 幫你生成這個值的話,能夠設置爲 AUTO
  • 線程池屬性

    • org.quartz.threadPool.threadCount:指定線程數,至少爲1(無默認值)(通常設置爲1-100直接的整數合適)
    • org.quartz.threadPool.threadPriority:設置線程的優先級(最大爲java.lang.Thread.MAX_PRIORITY 10,最小爲Thread.MIN_PRIORITY 1,默認爲5)
    • org.quartz.threadPool.class:線程池的實現類(通常使用 SimpleThreadPool 可知足幾乎全部用戶的需求)
  • 做業存儲設置

    • 描述了在調度器實例的生命週期中,Job 和 Trigger 信息是如何被存儲的。
  • 插件配置

    • 知足特定需求用到的 Quartz 插件的配置。

相關文章
相關標籤/搜索