淺談分佈式定時任務之quartz

前言

最近一段時間因公司項目須要進行分佈式定時任務框架選型,因爲資源(人力,時間)有限,因此重點考慮採用開源的一些解決方案,其中重點比較了3款框架:quartz,elastic-job,xxl-job等。因爲elastic-job 和xxl-job 實際上也是基於quartz實現的。因此頗有必要對quartz 有必定的瞭解。因此近期閱讀了大量quartz相關的一些文檔和博客,以及寫了一些demo進行驗證。本文主要是對近期工做的一個小結,簡要的介紹一下quartz 這個分佈式定時任務調度框架。html

目錄

  • 什麼是quartz?它有哪些特性?
  • quartz 核心概念和元素介紹
  • quartz 經常使用配置項介紹
  • quartz 集羣介紹

一.什麼是quartz?它有哪些特性?

quartz 是一個開源的分佈式調度庫,它基於java實現。
> 它有着強大的調度功能,支持豐富多樣的調度方式,好比簡單調度,基於cron表達式的調度等等。
> 支持調度任務的多種持久化方式。好比支持內存存儲,數據庫存儲,Terracotta server 存儲。
> 支持分佈式和集羣能力。
> 採用JDBCJobStore方式存儲時,針對事務的處理方式支持全局事務(和業務服務共享同一個事務)和局部事務(quarzt 單獨管理本身的事務)
> 基於plugin機制以及listener機制支持靈活的擴展。
複製代碼

二. quartz 核心概念和元素介紹:

  • Job: 工做任務。它提供了一個接口,只有一個方法void execute(JobExecutionContext context),開發者實現該接口定義運行任務,JobExecutionContext類提供了調度上下文的各類信息。Job運行時的信息保存在JobDataMap實例中.java

  • JobDetail:工做任務實例.Quartz在每次執行Job時,都從新建立一個Job實例,因此它不直接接受一個Job的實例,相反它接收一個Job實現類,以便運行時經過newInstance()的反射機制實例化Job。所以須要經過一個類來描述Job的實現類及其它相關的靜態信息,如Job名字、描述、關聯監聽器等信息,JobDetail承擔了這一角色.數據庫

  • Trigger:觸發器,用來描述觸發Job執行的時間觸發規則。主要有SimpleTrigger和CronTrigger這兩個子類。當僅需觸發一次或者以固定時間間隔週期執行,SimpleTrigger是最適合的選擇;而CronTrigger則能夠經過Cron表達式定義出各類複雜時間規則的調度方案:如每早晨9:00執行,周1、周3、週五下午5:00執行等.框架

  • Calendar:日曆,它表示一些特定時間點的集合.一個Trigger能夠和多個Calendar關聯,以便排除或包含某些時間點。假設,咱們安排每週星期一早上10:00執行任務,可是若是碰到法定的節日,任務則不執行,這時就須要在Trigger觸發機制的基礎上使用Calendar進行定點排除。運維

  • Scheduler:調度器,表明一個Quartz的獨立運行容器,Trigger和JobDetail能夠註冊到Scheduler中,二者在Scheduler中擁有各自的組及名稱,組及名稱是Scheduler查找定位容器中某一對象的依據,Trigger的組及名稱必須惟一,JobDetail的組和名稱也必須惟一(但能夠和Trigger的組和名稱相同,由於它們是不一樣類型的)。Scheduler定義了多個接口方法,容許外部經過組及名稱訪問和控制容器中Trigger和JobDetail。分佈式

    Scheduler能夠將Trigger綁定到某一JobDetail中,這樣當Trigger觸發時,對應的Job就被執行。一個Job能夠對應多個Trigger,但一個Trigger只能對應一個Job。
    複製代碼

三. quarz 經常使用配置項介紹

quartz 默認的配置文件是quartz.properties ,裏面有不少配置項,好比調度器(schedule)相關配置,事務的配置,監聽器,插件的配置,rmi 相關配置,集羣相關配置等等。 詳細配置信息能夠參照官方文檔:www.quartz-scheduler.org/documentati…spa

四. quratz 集羣介紹

quartz 集羣是依賴於數據庫機制實現的。部署多個節點的quartz 數據庫配置必須保持一致。quartz集羣是經過數據庫表來感知其餘的應用的,各個節點之間並無直接的通訊。只有使用持久的JobStore才能實現Quartz集羣。插件

quartz 默認提供了11張數據庫表:code

  • QRTZ_CALENDARS: 存儲Quartz的Calendar信息server

  • QRTZ_CRON_TRIGGERS:存儲CronTrigger,包括Cron表達式和時區信息

  • QRTZ_FIRED_TRIGGERS:存儲與已觸發的Trigger相關的狀態信息,以及相聯Job的執行信息

  • QRTZ_PAUSED_TRIGGER_GRPS:存儲已暫停的Trigger組的信息

  • QRTZ_SCHEDULER_STATE:存儲少許的有關Scheduler的狀態信息,和別的Scheduler實例

  • QRTZ_LOCKS:存儲程序的悲觀鎖的信息

  • QRTZ_JOB_DETAILS:存儲每個已配置的Job的詳細信息

  • QRTZ_SIMPLE_TRIGGERS:存儲簡單的Trigger,包括重複次數、間隔、以及已觸的次數

  • QRTZ_BLOG_TRIGGERS Trigger做爲Blob類型存儲

  • QRTZ_TRIGGERS 存儲已配置的Trigger的信息

  • QRTZ_SIMPROP_TRIGGERS:存儲簡單觸發器相關。

    要注意的是quartz集羣間的相互感知是經過數據庫表(QRTZ_SCHEDULER_STATE)實現的。對於水平集羣,存在着時間同步問題。節點用時間戳來通知其餘實例它本身的最後檢入時間。假如節點的時鐘被設置爲未來的時間,那麼運行中的Scheduler將再也意識不到那個結點已經宕掉了。另外一方面,若是某個節點的時鐘被設置爲過去的時間,也許另外一節點就會認定那個節點已宕掉並試圖接過它的Job重運行。
    複製代碼

小結

本文只是對quartz 分佈式定時任務作了一個簡單的介紹。quartz 做爲一個成熟的分佈式定時任務框架,然而好像並無提供友好的運維管理界面,幸運的是不少的開源框架彌補了這個不足,好比elastic-job ,xxl-job等等,關於quartz 的更多內容,在後面不斷的實踐中再補充。

相關文章
相關標籤/搜索