Quartz- Quartz API以及Jobs 和Triggers介绍
文章目錄
- Quartz API
- Jobs 和 Triggers
- 唯一標(biāo)識(shí)
Quartz API
Quartz API 主要包含了以下接口
-
Scheduler – 調(diào)度器,任務(wù)調(diào)度的主 API。
-
Job – 由調(diào)度器調(diào)度的任務(wù)需要實(shí)現(xiàn)的接口。
-
JobDetail – 用于定義任務(wù)的實(shí)例。
-
Trigger – 用于定義需要執(zhí)行的任務(wù)和任務(wù)的執(zhí)行時(shí)間。
-
JobBuilder – 用于定義/創(chuàng)建 JobDetail 實(shí)例。
-
TriggerBuilder – 用于定義/創(chuàng)建 Trigger 對(duì)象。
Scheduler(調(diào)度器)的生命周期由 SchedulerFactory 創(chuàng)建 Scheduler 開(kāi)始到調(diào)用 shutdown() 結(jié)束。
一旦創(chuàng)建了 Scheduler 實(shí)例,就可以新增,移除,查看 Job 和 Trigger,和執(zhí)行其它調(diào)度相關(guān)工作(例如暫停 Trigger)。
如果 Scheduler 沒(méi)有調(diào)用 start() 方法,那么將不會(huì)執(zhí)行任何 Trigger 上的任務(wù)。
Quartz 定義了 builder 類,它們定義了 Domain Specific Language(DSL,有時(shí)也成為“流式接口”)。
如下所示
// define the job and tie it to our HelloJob classJobDetail job = newJob(MyJob.class).withIdentity("myJob", "group1") // name "myJob", group "group1".build();// Trigger the job to run now, and then every 40 secondsTrigger trigger = newTrigger().withIdentity("myTrigger", "group1").startNow().withSchedule(simpleSchedule().withIntervalInSeconds(40).repeatForever()) .build();// Tell quartz to schedule the job using our triggersched.scheduleJob(job, trigger);上面代碼中:
創(chuàng)建 job 使用到的方法來(lái)自靜態(tài)導(dǎo)入的 JobBuilder 類,
創(chuàng)建 Trigger 的方法來(lái)自靜態(tài)導(dǎo)入的 TriggerBuilder,
同樣也靜態(tài)導(dǎo)入了 SimpleScheduleBuilder。
靜態(tài)導(dǎo)入的 DSL 可以通過(guò)下面語(yǔ)法定義:
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 有多個(gè)變體,用于定義不同類型的周期。
DateBuilder 中包含了大量的方法方便創(chuàng)建 java.util.Date 實(shí)例來(lái)指定時(shí)間。
Jobs 和 Triggers
任務(wù)需要實(shí)現(xiàn) Job 接口,接口中只有一個(gè)方法:
package org.quartz;public interface Job {public void execute(JobExecutionContext context)throws JobExecutionException;}當(dāng)任務(wù)的 Trigger 被觸發(fā),任務(wù)的 execute 方法將會(huì)由調(diào)度器的一個(gè)工作線程調(diào)用。傳入這個(gè)方法的 JobExecutionContext 對(duì)象用于提供任務(wù)運(yùn)行環(huán)境的信息(包含了一個(gè) Scheduler 的句柄,一個(gè)Trigger 的句柄,一個(gè) JobDetail 的句柄和幾個(gè)其它項(xiàng))。
JobDetail 由 Quartz 客戶端創(chuàng)建(你自己編寫(xiě))。它包含了大量的任務(wù)屬性設(shè)置和 JobMetaMap 對(duì)象(可用于存儲(chǔ)任務(wù)的狀態(tài)信息)。這個(gè)類本質(zhì)上來(lái)說(shuō)是用于定義 Job 對(duì)象。
Trigger 對(duì)象用于觸發(fā)任務(wù)的執(zhí)行。它定義了任務(wù)的執(zhí)行時(shí)間。當(dāng)你創(chuàng)建了一個(gè) Trigger,你需要提供你需要的時(shí)間表(schedule)用于控制任務(wù)的執(zhí)行。Trigger 可能還包含了 JobDataMap 對(duì)象,當(dāng)你需要傳遞參數(shù)給 Job 的時(shí)候,這個(gè)類就相當(dāng)有用。Quartz 提供了幾個(gè) Trigger 的實(shí)現(xiàn),其中最常用的是 SimpleTrigger 和 CronTrigger。
SimpleTrigger 用于執(zhí)行某個(gè)時(shí)間點(diǎn)執(zhí)行一次的任務(wù),或用于在某個(gè)時(shí)間執(zhí)行一次任務(wù),并且在 T 周期重復(fù)執(zhí)行 N 次。CronTrigger 用于基于日歷的任務(wù),例如“每周五中午”或“每個(gè)月10號(hào)上午10點(diǎn)15分”執(zhí)行。
為什么需要 Job 和 Trigger?有些任務(wù)調(diào)度方案沒(méi)有分離 job 和 trigger,為什么 Quartz 需要分別定義 Job 和 Trigger 呢?主要基于以下考慮。
多個(gè) Job 可以保存到同一個(gè) Trigger,多個(gè) Trigger 也可以關(guān)聯(lián)到相同的 Job。這種松耦合的設(shè)計(jì)的另外一個(gè)好處是可以在 trigger 過(guò)期后配置任務(wù)到調(diào)度器中,方便以后重新開(kāi)始任務(wù),而不用再次定義任務(wù)。也允許在不更換任務(wù)的情況下更改和替換 Trigger。
唯一標(biāo)識(shí)
Jobs 和 Triggers 可以使用 Quartz 調(diào)度器注冊(cè)一個(gè)唯一標(biāo)識(shí)。Job 和 Trigger 的鍵(JobKey 和 TriggerKey)允許進(jìn)行分組,這對(duì)于任務(wù)和觸發(fā)器來(lái)說(shuō)非常易于組織成像“報(bào)表任務(wù)”或“維護(hù)任務(wù)”這樣的分組。 分組中的鍵必須唯一。
總結(jié)
以上是生活随笔為你收集整理的Quartz- Quartz API以及Jobs 和Triggers介绍的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Quartz-任务调度概述及Quartz
- 下一篇: Quartz-Job 详解