淺談Quartz
近期閒來無事簡單的研究了一下任務排程框架(當然你可以可以稱它為工具,看問題的角度不同,在這裡我稱它為框架)---Quartz,在這裡和大家分享一下。
- OpenSymphony提供的強大的開源任務排程框架。
- 官網:http://www.quartz-scheduler.org/ 。
- Quartz是純java實現。
- Quartz的特點:
- 強大的排程功能
- 靈活的應用方式
- 分散式和叢集能力
- Quartz主要用到的設計模式:
- Builder模式
- Factory模式
- 元件模式
- 鏈式寫法
- Quartz體系結構:
- Quartz的三個核心概念:排程器,任務,觸發器。
- Quartz重要組成:Job,JobDetail,JobBuilder,JobStore,Trigger,TriggerBuilder,ThreadPool,Schedular,Calender,監聽器(JobListener,TriggerListener,SchedulerListener)。Quartz大概有300個類組成。
- 淺談Job:
- 實現業務邏輯的任務介面。
- Job介面非常容易實現,只有一個execute方法,在裡面編寫業務邏輯。
-
每次排程器執行job時,它在呼叫execute方法之前會建立一個新的job例項。
-
當呼叫完成後,關聯的job物件例項會被釋放,釋放的例項會被垃圾回收機制回收。
-
淺談JobDetail:JobDetail為Job例項提供了許多設定屬性,以及JobDataMap成員變數屬性,它用來儲存特定Job例項的狀態資訊,排程器需要藉助JobDetail物件來新增Job例項。
-
JobExecutionContext是什麼? 當Scheduler呼叫一個Job,就會將JobExecutionContext傳遞給Job的execute()方法。 Job能通過JobExecutionContext物件訪問到Quart執行時候的環境以及Job本身的明細資料。
-
JobDataMap是什麼?
-
在進行任務排程時JobDataMap儲存在JobExecutionContext中,非常方便獲取。
-
JobDataMap可以用來裝載任何可序列化的資料物件,當Job例項物件被執行時這些引數物件會傳遞給它。
-
JobDataMap實現了JDK的Map介面,並且添加了一些非常方便的方法來存取基本資料型別。
-
-
獲取JobDetail和Trigger中自定義引數的兩種方式:
-
通過JobExecutionContext例項獲取JobDateMap物件,使用該物件中的方法獲取。
-
在Job實現類中新增getter/setter方法(Quartz框架預設的JobFactory實現類在初始化job例項物件時會自動呼叫這些setter方法將引數值傳過來)。
-
-
淺談Trigger:
觸發器通用屬性:
JobKey: Job例項的標識,觸發器被觸發時,該指定的Job例項會執行。
StartTime: 首次被觸發的時間。它的值的型別是Java.util.Date。
EndTime: 指定觸發器不在被觸發的時間。它的值的型別是Java.util.Date。
-
使用SimpleTrigger需要注意的幾點:
-
重複次數可以為:0,正整數或者是SimpleTrigger.REPEAT_INDEFINITELY常量值。
-
重複執行間隔必須為0或長整數。
-
.一旦被指定了endTime引數,那麼它會覆蓋重複執行次數引數的效果。
-
-
淺談CronTrigger:
-
基於日曆的作業排程器,而不是像SimpleTrigger那樣精確指定間隔時間,比SimpleTrigger更常用。
-
Cron表示式:用於配置CronTrigger例項,是由7個子表示式組成的字串,描述了時間表的詳細資訊,格式:[秒] [分] [小時] [日] [月] [周] [年]。
-
我們還可以使用線上生成器幫我們生成:http://cron.qqe2.com/。
-
-
淺談Scheduler:
-
SchedulerFactory的兩個實現類:StdSchedulerFactory 和DirectSchedulerFactory。
-
StdSchedulerFactory:
- 使用一組引數(Java.util.Properties)來建立和初始化Quartz排程器。
- 配置引數一般儲存在quartz.properties中。
- 呼叫getScheduler方法就能建立和初始化物件。
-
- quartz.properties組成部分:排程器屬性,執行緒池屬性,作業儲存屬性,外掛配置。
好了,今天就給大家總結到這裡,歡迎大家吐槽拍磚。