1. 程式人生 > >Quartz API,Jobs和Triggers

Quartz API,Jobs和Triggers

Quartz API

Quartz API的關鍵介面是:

  • Scheduler - 與排程程式互動的主要API
  • Job - 由希望由排程程式執行的元件實現的介面
  • JobDetail - 用於定義作業的例項
  • Trigger(即觸發器) - 定義執行給定作業的計劃的元件
  • JobBuilder - 用於定義/構建JobDetail例項,用於定義作業的例項
  • TriggerBuilder - 用於定義/構建觸發器例項
  • Scheduler的生命期,從SchedulerFactory建立它時開始,到Scheduler調
    shutdown()方法時結束;Scheduler被建立後,可以增加、刪除和列舉Job和Trigger,以及執行其它與排程相關的操作(如暫停Trigger)。但是,Scheduler只有在呼叫start()方法後,才會真正地觸發trigger(即執行job)

Quartz提供的“builder”類,可以認為是一種領域特定語言(DSL,Domain Specific Language)。教程一中有相關示例,這裡是其中的程式碼片段:(校對注:這種級聯的API非常方便使用者使用,大家以後寫對外介面時也可以使用這種方式)


  // 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和Trigger

一個job就是一個實現了Job介面的類,該介面只有一個方法:Job介面


  public interface Job {

    public void execute(JobExecutionContext context)
      throws JobExecutionException;
  }

當Job的一個trigger被觸發(稍後會講到)時,execute()方法由排程程式的一個工作執行緒呼叫。傳遞給execute()方法的JobExecutionContext物件向作業例項提供有關其“執行時”環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。

Key

將Job和Trigger註冊到Scheduler時,可以為它們設定key,配置其身份屬性。Job和Trigger的key(JobKey和TriggerKey)可以用於將Job和Trigger放到不同的分組(group)裡,然後基於分組進行操作。同一個分組下的Job或Trigger的名稱必須唯一,即一個Job或Trigger的key由名稱(name)和分組(group)組成。