Quartz API的關(guān)鍵接口是:
Quartz 提供的“builder”類,可以認(rèn)為是一種領(lǐng)域特定語言(DSL,Domain Specific Language)。教程一中有相關(guān)示例,這里是其中的代碼片段:(校對注:這種級聯(lián)的 API 非常方便用戶使用,大家以后寫對外接口時也可以使用這種方式)
// define the job and tie it to our HelloJob class
JobDetail job = newJob(HelloJob.class)
.withIdentity("myJob", "group1") // name "myJob", group "group1"
.build();
// Trigger the job to run now, and then every 40 seconds
Trigger trigger = newTrigger()
.withIdentity("myTrigger", "group1")
.startNow()
.withSchedule(simpleSchedule()
.withIntervalInSeconds(40)
.repeatForever())
.build();
// Tell quartz to schedule the job using our trigger
sched.scheduleJob(job, trigger);
DSL 的靜態(tài)導(dǎo)入可以通過以下導(dǎo)入語句來實現(xiàn):
import static org.quartz.JobBuilder.*;
import static org.quartz.SimpleScheduleBuilder.*;
import static org.quartz.CronScheduleBuilder.*;
import static org.quartz.CalendarIntervalScheduleBuilder.*;
import static org.quartz.TriggerBuilder.*;
import static org.quartz.DateBuilder.*;
SchedulerBuilder 接口的各種實現(xiàn)類,可以定義不同類型的調(diào)度計劃 (schedule);
DateBuilder 類包含很多方法,可以很方便地構(gòu)造表示不同時間點的 java.util.Date 實例(如定義下一個小時為偶數(shù)的時間點,如果當(dāng)前時間為 9:43:27,則定義的時間為10:00:00)。
一個 job 就是一個實現(xiàn)了 Job 接口的類,該接口只有一個方法:
Job 接口:
package org.quartz;
public interface Job {
public void execute(JobExecutionContext context)
throws JobExecutionException;
}
job的一個 trigger 被觸發(fā)后(稍后會講到),execute() 方法會被 scheduler 的一個工作線程調(diào)用;傳遞給 execute() 方法的 JobExecutionContext 對象中保存著該 job 運行時的一些信息 ,執(zhí)行 job 的 scheduler 的引用,觸發(fā) job 的 trigger 的引用,JobDetail 對象引用,以及一些其它信息。
JobDetail 對象是在將 job 加入 scheduler 時,由客戶端程序(你的程序)創(chuàng)建的。它包含 job 的各種屬性設(shè)置,以及用于存儲 job 實例狀態(tài)信息的 JobDataMap。本節(jié)是對 job 實例的簡單介紹,更多的細(xì)節(jié)將在下一節(jié)講到。
Trigger 用于觸發(fā) Job 的執(zhí)行。當(dāng)你準(zhǔn)備調(diào)度一個 job 時,你創(chuàng)建一個 Trigger 的實例,然后設(shè)置調(diào)度相關(guān)的屬性。Trigger 也有一個相關(guān)聯(lián)的 JobDataMap,用于給 Job 傳遞一些觸發(fā)相關(guān)的參數(shù)。Quartz 自帶了各種不同類型的 Trigger,最常用的主要是 SimpleTrigger 和 CronTrigger。
SimpleTrigger 主要用于一次性執(zhí)行的 Job(只在某個特定的時間點執(zhí)行一次),或者 Job 在特定的時間點執(zhí)行,重復(fù)執(zhí)行 N 次,每次執(zhí)行間隔T個時間單位。CronTrigger 在基于日歷的調(diào)度上非常有用,如“每個星期五的正午”,或者“每月的第十天的上午 10:15”等。
為什么既有 Job,又有 Trigger 呢?很多任務(wù)調(diào)度器并不區(qū)分 Job 和 Trigger。有些調(diào)度器只是簡單地通過一個執(zhí)行時間和一些 job 標(biāo)識符來定義一個 Job;其它的一些調(diào)度器將 Quartz 的 Job 和 Trigger 對象合二為一。在開發(fā) Quartz 的時候,我們認(rèn)為將調(diào)度和要調(diào)度的任務(wù)分離是合理的。在我們看來,這可以帶來很多好處。
例如,Job 被創(chuàng)建后,可以保存在 Scheduler 中,與 Trigger 是獨立的,同一個 Job可以有多個 Trigger;這種松耦合的另一個好處是,當(dāng)與 Scheduler 中的 Job 關(guān)聯(lián)的 trigger 都過期時,可以配置 Job 稍后被重新調(diào)度,而不用重新定義 Job;還有,可以修改或者替換 Trigger,而不用重新定義與之關(guān)聯(lián)的 Job。
將 Job 和 Trigger 注冊到 Scheduler 時,可以為它們設(shè)置 key,配置其身份屬性。 Job 和 Trigger 的 key(JobKey 和 TriggerKey)可以用于將 Job 和 Trigger 放到不同的分組(group)里,然后基于分組進(jìn)行操作。同一個分組下的 Job 或 Trigger 的名稱必須唯一,即一個 Job 或 Trigger 的 key 由名稱(name)和分組(group)組成。
您現(xiàn)在有一個關(guān)于什么 Job 和觸發(fā)器的一般概念,您可以在第3課中了解更多信息有關(guān)作業(yè)和作業(yè)詳細(xì)信息以及第4課:有關(guān)觸發(fā)器的更多信息。
更多建議: