Quartz簡介
Quartz是OpenSymphony開源組織在Job scheduling領(lǐng)域又一個功能豐富的催烘,開放源碼的作業(yè)調(diào)度項目灼舍,完全基于java實現(xiàn)萧福,可集成到幾乎所有的Java應(yīng)用程序中崇摄。Jobs可以是任何自定義的業(yè)務(wù)邏輯擎值。Quartz可以用來創(chuàng)建簡單或復(fù)雜的調(diào)度器,用來執(zhí)行數(shù)十成百上千甚至上萬個Jobs逐抑。
優(yōu)勢及概念
作為一個優(yōu)秀的開源調(diào)度框架鸠儿,Quartz 具有以下特點:
強大的調(diào)度功能,例如支持豐富多樣的調(diào)度方法厕氨,可以滿足各種常規(guī)及特殊需求进每;
靈活的應(yīng)用方式,例如支持任務(wù)和調(diào)度的多種組合方式腐巢,支持調(diào)度數(shù)據(jù)的多種存儲方式品追;
分布式和集群能力,Terracotta 收購后在原來功能基礎(chǔ)上作了進一步提升冯丙。本文暫不討論該部分內(nèi)容
另外肉瓦,作為 Spring 默認(rèn)的調(diào)度框架,Quartz 很容易與 Spring 集成實現(xiàn)靈活可配置的調(diào)度功能胃惜。
下面是本文中用到的一些專用詞匯泞莉,在此聲明:
scheduler:
任務(wù)調(diào)度器
trigger:
觸發(fā)器,用于定義任務(wù)調(diào)度時間規(guī)則
job:
任務(wù)船殉,即被調(diào)度的任務(wù)
misfire:
錯過的鲫趁,指本來應(yīng)該被執(zhí)行但實際沒有被執(zhí)行的任務(wù)調(diào)度
key:
由名稱(name)和分組(group)組成,將Job和Trigger注冊到Scheduler時,需要為它們設(shè)置key
核心組件
1.核心組件關(guān)系圖
2.核心組件邏輯關(guān)系
任務(wù)調(diào)度器(scheduler)在觸發(fā)器(trigger)指定的時刻調(diào)度任務(wù)(job)利虫。
3.組件工作過程
1).Scheduler在使用之前需要實例化挨厚。一般通過SchedulerFactory來創(chuàng)建一個實例堡僻。
SchedulerFactory sf=new StdSchedulerFactory();
Scheduler sched=sf.getScheduler();
StdSchedulerFactory創(chuàng)建出一個簡單的調(diào)度器,采用RAMJobStore存儲方式 疫剃,將 trigger 和 job 存儲在內(nèi)存中钉疫。
2).創(chuàng)建一個任務(wù)用于執(zhí)行特定業(yè)務(wù)。
JobDetail job = newJob(HelloJob.class).withIdentity("myJob", "group1").build();
其中HelloJob是自定義的實現(xiàn)Job接口業(yè)務(wù)類巢价,是無狀態(tài)的(stateless)的任務(wù)牲阁,可以被并行執(zhí)行,即二次調(diào)度不受上次調(diào)度是否執(zhí)行完畢影響壤躲。
3).創(chuàng)建一個觸發(fā)器城菊,用于指定在何時執(zhí)行任務(wù),此處使用CronTirgger碉克。
CronTrigger trigger=newTrigger()
.withIdentity("trigger1","group1")
.withSchedule(cronSchedule("0/20 * * * * ?"))
.build();
CronTirgger 類似于 LINUX 上的任務(wù)調(diào)度命令 crontab凌唬,即利用一個包含 7 個字段的表達式來表示時間調(diào)度方式。例如棉胀,"0 15 10 * * ? *" 表示每天的 10:15AM 執(zhí)行任務(wù)法瑟。對于涉及到星期和月份的調(diào)度,CronTirgger 是最適合的唁奢,甚至某些情況下是唯一選擇霎挟。例如,"0 10 14 ? 3 WED" 表示三月份的每個星期三的下午 14:10PM 執(zhí)行任務(wù)麻掸。
4)注冊任務(wù)與觸發(fā)器到任務(wù)調(diào)度器
scheduler.scheduleJob(job, trigger);
Key
將Job和Trigger注冊到Scheduler時酥夭,可以為它們設(shè)置key,配置其身份屬性脊奋。Job和Trigger的key(JobKey和TriggerKey)可以用于將Job和Trigger放到不同的分組(group)里熬北,然后基于分組進行操作。同一個分組下的Job或Trigger的名稱必須唯一诚隙,即一個Job或Trigger的key由名稱(name)和分組(group)組成讶隐。