Quartz API,Jobs和Triggers

2020-12-16 09:32 更新

Quartz API

Quartz API的關(guān)鍵接口是:

  • Scheduler - 與調(diào)度程序交互的主要API。
  • Job - 你想要調(diào)度器執(zhí)行的任務(wù)組件需要實(shí)現(xiàn)的接口
  • JobDetail - 用于定義作業(yè)的實(shí)例。
  • Trigger(即觸發(fā)器) - 定義執(zhí)行給定作業(yè)的計(jì)劃的組件。
  • JobBuilder - 用于定義/構(gòu)建 JobDetail 實(shí)例,用于定義作業(yè)的實(shí)例。
  • TriggerBuilder - 用于定義/構(gòu)建觸發(fā)器實(shí)例。
  • Scheduler 的生命期,從 SchedulerFactory 創(chuàng)建它時(shí)開始,到 Scheduler 調(diào)用shutdown() 方法時(shí)結(jié)束;Scheduler 被創(chuàng)建后,可以增加、刪除和列舉 Job 和 Trigger,以及執(zhí)行其它與調(diào)度相關(guān)的操作(如暫停 Trigger)。但是,Scheduler 只有在調(diào)用 start() 方法后,才會(huì)真正地觸發(fā) trigger(即執(zhí)行 job),見教程一

Quartz 提供的“builder”類,可以認(rèn)為是一種領(lǐng)域特定語(yǔ)言(DSL,Domain Specific Language)。教程一中有相關(guān)示例,這里是其中的代碼片段:(校對(duì)注:這種級(jí)聯(lián)的 API 非常方便用戶使用,大家以后寫對(duì)外接口時(shí)也可以使用這種方式)

// 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)入可以通過(guò)以下導(dǎo)入語(yǔ)句來(lái)實(shí)現(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 接口的各種實(shí)現(xiàn)類,可以定義不同類型的調(diào)度計(jì)劃 (schedule);

DateBuilder 類包含很多方法,可以很方便地構(gòu)造表示不同時(shí)間點(diǎn)的 java.util.Date 實(shí)例(如定義下一個(gè)小時(shí)為偶數(shù)的時(shí)間點(diǎn),如果當(dāng)前時(shí)間為 9:43:27,則定義的時(shí)間為10:00:00)。

Job 和 Trigger

一個(gè) job 就是一個(gè)實(shí)現(xiàn)了 Job 接口的類,該接口只有一個(gè)方法:

Job 接口:


  package org.quartz;

  public interface Job {

    public void execute(JobExecutionContext context)
      throws JobExecutionException;
  }

job的一個(gè) trigger 被觸發(fā)后(稍后會(huì)講到),execute() 方法會(huì)被 scheduler 的一個(gè)工作線程調(diào)用;傳遞給 execute() 方法的 JobExecutionContext 對(duì)象中保存著該 job 運(yùn)行時(shí)的一些信息 ,執(zhí)行 job 的 scheduler 的引用,觸發(fā) job 的 trigger 的引用,JobDetail 對(duì)象引用,以及一些其它信息。

JobDetail 對(duì)象是在將 job 加入 scheduler 時(shí),由客戶端程序(你的程序)創(chuàng)建的。它包含 job 的各種屬性設(shè)置,以及用于存儲(chǔ) job 實(shí)例狀態(tài)信息的 JobDataMap。本節(jié)是對(duì) job 實(shí)例的簡(jiǎn)單介紹,更多的細(xì)節(jié)將在下一節(jié)講到。

Trigger 用于觸發(fā) Job 的執(zhí)行。當(dāng)你準(zhǔn)備調(diào)度一個(gè) job 時(shí),你創(chuàng)建一個(gè) Trigger 的實(shí)例,然后設(shè)置調(diào)度相關(guān)的屬性。Trigger 也有一個(gè)相關(guān)聯(lián)的 JobDataMap,用于給 Job 傳遞一些觸發(fā)相關(guān)的參數(shù)。Quartz 自帶了各種不同類型的 Trigger,最常用的主要是 SimpleTrigger 和 CronTrigger。

SimpleTrigger 主要用于一次性執(zhí)行的 Job(只在某個(gè)特定的時(shí)間點(diǎn)執(zhí)行一次),或者 Job 在特定的時(shí)間點(diǎn)執(zhí)行,重復(fù)執(zhí)行 N 次,每次執(zhí)行間隔T個(gè)時(shí)間單位。CronTrigger 在基于日歷的調(diào)度上非常有用,如“每個(gè)星期五的正午”,或者“每月的第十天的上午 10:15”等。

為什么既有 Job,又有 Trigger 呢?很多任務(wù)調(diào)度器并不區(qū)分 Job 和 Trigger。有些調(diào)度器只是簡(jiǎn)單地通過(guò)一個(gè)執(zhí)行時(shí)間和一些 job 標(biāo)識(shí)符來(lái)定義一個(gè) Job;其它的一些調(diào)度器將 Quartz 的 Job 和 Trigger 對(duì)象合二為一。在開發(fā) Quartz 的時(shí)候,我們認(rèn)為將調(diào)度和要調(diào)度的任務(wù)分離是合理的。在我們看來(lái),這可以帶來(lái)很多好處。

例如,Job 被創(chuàng)建后,可以保存在 Scheduler 中,與 Trigger 是獨(dú)立的,同一個(gè) Job可以有多個(gè) Trigger;這種松耦合的另一個(gè)好處是,當(dāng)與 Scheduler 中的 Job 關(guān)聯(lián)的 trigger 都過(guò)期時(shí),可以配置 Job 稍后被重新調(diào)度,而不用重新定義 Job;還有,可以修改或者替換 Trigger,而不用重新定義與之關(guān)聯(lián)的 Job。

Key

將 Job 和 Trigger 注冊(cè)到 Scheduler 時(shí),可以為它們?cè)O(shè)置 key,配置其身份屬性。 Job 和 Trigger 的 key(JobKey 和 TriggerKey)可以用于將 Job 和 Trigger 放到不同的分組(group)里,然后基于分組進(jìn)行操作。同一個(gè)分組下的 Job 或 Trigger 的名稱必須唯一,即一個(gè) Job 或 Trigger 的 key 由名稱(name)和分組(group)組成。

您現(xiàn)在有一個(gè)關(guān)于什么 Job 和觸發(fā)器的一般概念,您可以在第3課中了解更多信息有關(guān)作業(yè)和作業(yè)詳細(xì)信息以及第4課:有關(guān)觸發(fā)器的更多信息。


以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)