Quartz是開源組織OpenSymphony的一個作業調度框架,採用多線程架構,可伸縮性強,可集羣擴展。
Quartz提供的常用類:Scheduler, SchedulerFactory, Job, JobDetail, JobBuilder, Trigger, TriggerBuilder, ScheduleBuilder
UML類圖如下:
Scheduler時Quartz調度程序的主要接口,維護一個JobDetails和Triggers的註冊表,到觸發時間時,調度程序將執行Job。
調度程序Scheduler實例通過SchedulerFactory工廠創建,有兩個實現類DirectSchedulerFactory和StdSchedulerFactory,前者不寫入持久化數據庫,後者加載quartz.properties屬性配置文件,將查找加載當前目錄和org.quartz包。
任務是實現Job接口的一個類,實現方法execute(),可聲明屬性:
- @DisallowConcurrentExecution,同時只執行一個實例。
- @PersisJobDataAfterExecution,正常執行後將JobDataMap備份。
JobDetail將任務屬性傳遞給Scheduler,通過JobBuilder創建,JobDataMap保存任務實例的狀態信息。
觸發器Trigger通過TriggerBuilder創建,結合ScheduleBuilder設置時間規則,可通過JobDataMap傳遞數據給Job。常用的兩種觸發器:
- SimpleTrigger:指定開始時間、結束時間、重複次數、執行間隔。
- CronTrigger:使用Cron表達式設置時間規則。
構建ScheduleBuilder設置時間規則時,可配置Misfire選項,指定執行失敗熄火時的處理規則:
含義 | 支持ScheduleBuilder | |
IgnoreMisfires | 馬上執行,比如整點9點失敗,系統10:15啓動,會馬上執行9點10點的任務。 | SimpleSchedule CronScheduleBuilder CalendarIntervalScheduleBuilder DailyTimeIntervalScheduleBuilder |
FireNow | 立即再次觸發 | SimpleSchedule |
NowWithExistingCount | 立即再次觸發,不計入總次數。 | SimpleSchedule |
NowWithRemainingCount | 立即再次觸發,計入總次數。 | SimpleSchedule |
NextWithExistingCount | 等待下次執行,不計入總次數。 | SimpleSchedule |
NextWithRemainingCount | 等待下次執行,計入總次數。 | SimpleSchedule |
DoNothing | 不做任何處理,執行下一次週期。 | CronScheduleBuilder CalendarIntervalScheduleBuilder DailyTimeIntervalScheduleBuilder |
FireAndProceed | 合併下一個週期,正常執行。比如整點9點10點失敗,系統10:15啓動,在11點合併執行一次。 | CronScheduleBuilder CalendarIntervalScheduleBuilder DailyTimeIntervalScheduleBuilder |