天天看點

Quartz教程二:API,Job和Trigger

quartz api核心接口有:

scheduler – 與scheduler互動的主要api;

job – 你通過scheduler執行任務,你的任務類需要實作的接口;

jobdetail – 定義job的執行個體;

trigger – 觸發job的執行;

jobbuilder – 定義和建立jobdetail執行個體的接口;

triggerbuilder – 定義和建立trigger執行個體的接口;

quartz提供的“builder”類,可以認為是一種領域特定語言(dsl,domain specific language)。教程一中有相關示例,這裡是其中的代碼片段:(校對注:這種級聯的api非常友善使用者使用,大家以後寫對外接口時也可以使用這種方式)

定義job的代碼使用的是從jobbuilder靜态導入的方法。同樣,定義trigger的代碼使用的是從triggerbuilder靜态導入的方法 。 另外,也導入了simpleschedulerbuilder類的靜态方法;

從dsl裡靜态導入的語句如下:

schedulerbuilder接口的各種實作類,可以定義不同類型的排程計劃(schedule);

datebuilder類包含很多方法,可以很友善地構造表示不同時間點的java.util.date執行個體(如定義下一個小時為偶數的時間點,如果目前時間為9:43:27,則定義的時間為10:00:00)。

一個job就是一個實作了job接口的類,該接口隻有一個方法:

job接口:

當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主要用于一次性執行的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)組成。

繼續閱讀