Quartz2.2.x官方文檔2.2.X—第三章 2.Quartz API,Jobs和Triggers

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 & JobDetailsLesson 4: More About Triggers.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章