Quartz教程
內容表 | ‹ Lesson 1 | ‹ Lesson 3 |
課程 2: Quartz API, Jobs And Triggers
Quartz API
Quartz API的關鍵接口:
- Scheduler - 調度操作的主API.
- Job - 一個你實現即可執行調度任務的接口.
- JobDetail - 使用定義的Jobs實例.
- Trigger - 一個指定了Job執行時間的組件.
- JobBuilder - 使用它定義/構建JobDetail和Jobs實例.
- TriggerBuilder - 使用它定義/構建觸發Trigger實例.
一個 Scheduler的生命週期受到它創建的限制,通過 SchedulerFactory 和調用shutdown()方法. 當創建調度接口,可以add、remove、list Jobs和Trigger,以及執行其他調度操作(例如暫停觸發器)。實際上, 知道調用start()方法開始調度之前,調度程序不會觸發任何triggers(執行jobs),如課程1所示。
Quartz提供“builder”類來作爲定義特定領域的語言(或者 DSL, 有時也被成爲流式接口). 在上一節課中你看到一個例子,我們繼續來從這部分來講解:
// 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類的方法。同樣的,構建觸發器的代碼塊使用的是TriggerBuilder類的方法,同樣的還有從 SimpleScheduleBulder 類.
可以通過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.*;
各種“ScheduleBuilder”類有方法定義不同類型的schedules。
DateBuilder類包含不同方法來方便的構造特定時間的java.util.Date實例(例如實現獲得下一個整點小時的日期 - 具體點就是,例如當前時間9:43:27 那麼下個時間是10:00:00).
Jobs 和 Triggers
Job是要被實現的接口類,它僅僅包含一個簡單的方法:
Job接口
package org.quartz;
public interface Job {
public void execute(JobExecutionContext context)
throws JobExecutionException;
}
當Job的觸發器被觸發時,(稍後再詳細介紹), execute(..)方法被調度任務之一的線程調用。傳遞給這個方法的JobExecutionContext對象提供了job實例關於"運行時"環境的信息-包含執行它的Scheduler句柄, 觸發執行的Trigger句柄,job的JobDetail對象,一些其他信息。
在Job被添加到Scheduler時,JobDetail對象被Quartz客戶端(你的程序)創建。它包含關於Job的多種設置屬性,像是JobDataMap,能夠使用它來記錄job類實例的狀態信息。本質上是定義了job實例,在下節課我們會進一步進行討論。
Trigger對象被用來觸發jobs的執行。當你希望調度一個任務,你可以實例化一個trigger,然後調整它的屬性以使它在指定時間觸發。Triggers也可能有與之相關聯的JobDataMap-這對於參數傳遞給特定的觸發器觸發作業是有用的。Quartz ships擁有不同類型的類型, 但是大多數使用SimpleTrigger和CronTrigger類型。
如果你只需要一次使用,SimpleTrigger是十分方便的。 (在指定時間只執行一個單獨的任務), 或者如果你需要在指定時間觸發一個任務,讓它在指定時間內觸發N詞,每次間隔時間T。如果你期望基於日曆週期來觸發,使用CronTrigger則十分方便 - 例如"每個星期五中午"或者"每個月第10天10:15。
爲什麼要有Jobs和觸發器? 許多任務調度程序沒有jobs和triggers的單獨概念。有些時候會將'job'簡單定義爲一個執行時間(或調度)以及一些任務標識。其他則類似於Quartz job和trigger對象相結合。在開發Quartz的過程中,我們認識到在調度和時間表中所執行的任務相分離是有意義的。這有許多好處。
例如,能在作業調度中創建和存儲Job,而不是依賴於trigger,大量的觸發器可以關聯同一個任務。另個一好吃是,這種鬆耦合結構能夠在觸發器過期後,將調度任務留在調度中,這樣就可以在以後重新安排,不需要重新定義它. 它還允許你修改或替換觸發器,而不需要重新定義關聯的job.
特性
Jobs and Triggers在Quartz scheduler註冊時會被指定標識Key。Jobs和Triggers的Key(JobKey和TriggerKey)允許它們是設置'groups',這有利於你的jobs和triggers分類,例如"reporting jobs"和"mantenance jobs"。job和trigger的鍵名稱部分必須爲組內唯一 - 換句話說,job或者trigger的完整key(或者說標識)是由分組和名稱決定的。
你現在關於Jobs和Triggers有了一個一般的概念,你可以學習更多關於它們的內容 Lesson 3: More About Jobs & JobDetails 和 Lesson 4: More About Triggers.