Quartz API核心接口有:java
Scheduler - 與scheduler交互的主要API;git
Job - 你經過scheduler執行任務,你的任務類須要實現的接口;github
JobDetail - 定義Job的實例;web
Trigger - 觸發Job的執行;api
JobBuilder - 定義和建立JobDetail實例的接口;ui
TriggerBuilder - 定義和建立Trigger實例的接口;spa
Scheduler的生命期,從SchedulerFactory建立它時開始,到Scheduler調用shutdown()方法時結束;Scheduler被建立後,能夠增長、刪除和列舉Job和Trigger,以及執行其它與調度相關的操做(如暫停Trigger)。可是,Scheduler只有在調用start()方法後,纔會真正地觸發trigger(即執行job),見教程一。線程
Quartz提供的「builder」類,能夠認爲是一種領域特定語言(DSL,Domain Specific Language)。教程一中有相關示例,這裏是其中的代碼片斷:code
// 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);
定義job的代碼使用的是從JobBuilder靜態導入的方法。一樣,定義trigger的代碼使用的是從TriggerBuilder靜態導入的方法 - 另外,也導入了SimpleSchedulerBuilder類的靜態方法;orm
從DSL裏靜態導入的語句以下:
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接口的各類實現類,能夠定義不一樣類型的調度計劃(schedule);
DateBuilder類包含不少方法,能夠很方便地構造表示不一樣時間點的java.util.Date實例(如定義下一個小時爲偶數的時間點,若是當前時間爲9:43:27,則定義的時間爲10:00:00)。
一個job就是一個實現了Job接口的類,該接口只有一個方法:
Job接口:
package org.quartz; public interface Job { public void execute(JobExecutionContext context) throws JobExecutionException; }
當job的一個trigger被觸發後(稍後會講到),execute()方法會被scheduler的一個工做線程調用;傳遞給execute()方法的JobExecutionContext對象中保存着該job運行時的一些信息 - 執行job的scheduler的引用,觸發job的trigger的引用,JobDetail對象引用,以及一些其它信息。
JobDetail對象是在將job加入scheduler時,由客戶端程序(你的程序)建立的。它包含job的各類屬性設置,以及用於存儲job實例狀態信息的JobDataMap。本節是對job實例的簡單介紹,更多的細節將在下一節講到。
Trigger用於觸發Job的執行。當你準備調度一個job時,你建立一個Trigger的實例,而後設置調度相關的屬性。Trigger也有一個相關聯的JobDataMap,用於給Job傳遞一些觸發相關的參數。Quartz自帶了各類不一樣類型的Trigger,最經常使用的主要是SimpleTrigger和CronTrigger。
SimpleTrigger主要用於「一次性」(one-shot)執行的Job(只在某個特定的時間點執行一次),或者Job在特定的時間點執行,重複執行N次,每次執行之間延遲T個時間單位。CronTrigger在基於日曆的調度上很是有用,如「每一個星期五的正午」,或者「每個月的第十天的上午10:15」等。
爲何既有Job,又有Trigger呢?不少任務調度器並不區分Job和Trigger。有些調度器只是簡單地經過一個執行時間和一些job標識符來定義一個Job;其它的一些調度器將Quartz的Job和Trigger對象合二爲一。在開發Quartz的時候,咱們認爲將調度和要調度的任務分離是合理的。在咱們看來,這能夠帶來不少好處。
例如,Job被建立後,能夠保存在Scheduler中,與Trigger是獨立的,同一個Job能夠有多個Trigger;這種鬆耦合的另外一個好處是,當與Scheduler中的Job關聯的trigger都過時了時,能夠配置Job稍後被從新調度,而不用從新定義Job;還有,能夠修改或者替換Trigger,而不用從新定義與之關聯的Job。
將Job和Trigger註冊到Scheduler時,能夠爲它們設置key,配置其身份屬性。Job和Trigger的key(JobKey和TriggerKey)能夠用於將Job和Trigger放到不一樣的分組(group)裏,而後基於分組進行操做。同一個分組下的Job或Trigger的名稱必須惟一,即一個Job或Trigger的key由名稱(name)和分組(group)組成。