quartz學習筆記(1)---scheduler and Job

java編寫的開源作業調度框架,可單獨使用,可與其他應用結合,Job和Trigger多對多的關係.
 
 
  • Scheduler - 與調度器交互的主要API.
  • Job - 一個被組件(你希望調度器執行的內容)實現的接口.
  • JobDetail - 定義Job的實例化.
  • Trigger - 一個組件,它定義執行給定作業的調度.
  • JobBuilder - 用於定義/構建JobDetail實例,該實例定義Jobs實例.
  • TriggerBuilder - 用於定義/構建Trigger實例.

Scheduler的生命週期受其創建的限制,方法是通過SchedulerFactory並調用其shutdown()方法。 創建計劃程序界面後,即可使用它添加,刪除和列出作業(Job)和觸發器(Trigger),以及執行其他與計劃相關的操作(例如暫停觸發器)。 但是,在使用start()方法啓動調度程序之前,調度程序實際上不會對任何觸發器(執行作業)起作用.

 

// 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);

Jobs and Triggers

Job的類實現了Job的接口,並實現其execute方法.

 package org.quartz;

  public interface Job {

    public void execute(JobExecutionContext context)
      throws JobExecutionException;
  }

當Job的Trigger被觸發,調度工作線程會執行execute方法.傳遞給此方法的JobExecutionContext對象爲作業實例提供有關其運行時環境的信息.

 public class HelloJob implements Job {

    public HelloJob() {
    }

    public void execute(JobExecutionContext context)
      throws JobExecutionException
    {
      System.err.println("Hello!  HelloJob is executing.");
    }
  }

JavaDataMap

JobDataMap可用於保存任意數量的(可序列化的)數據對象,您希望在作業實例執行時將這些對象提供給作業實例。JobDataMap是Java Map接口的一個實現,它增加了一些方便的方法來存儲和檢索基本類型的數據。 

作業執行期間在JobExecutionContext上找到的JobDataMap提供了一種便利。它是JobDetail上的JobDataMap和觸發器上的JobDataMap的合併,後者中的值覆蓋了前者中任何同名的值。

  // define the job and tie it to our DumbJob class
  JobDetail job = newJob(DumbJob.class)
      .withIdentity("myJob", "group1") // name "myJob", group "group1"
      .usingJobData("jobSays", "Hello World!")
      .usingJobData("myFloatValue", 3.141f)
      .build();
public class DumbJob implements Job {

    public DumbJob() {
    }

    public void execute(JobExecutionContext context)
      throws JobExecutionException
    {
      JobKey key = context.getJobDetail().getKey();

      JobDataMap dataMap = context.getJobDetail().getJobDataMap();

      String jobSays = dataMap.getString("jobSays");
      float myFloatValue = dataMap.getFloat("myFloatValue");

      System.err.println("Instance " + key + " of DumbJob says: " + jobSays + ", and val is: " + myFloatValue);
    }
  }

Job的實例化

您可以創建一個作業類,並通過創建多個JobDetails實例(每個實例都有自己的一組屬性和JobDataMap)在調度器中存儲它的許多實例定義,然後將它們全部添加到調度器中。

觸發觸發器時,將加載與其關聯的JobDetail(實例定義),並通過在Scheduler上配置的JobFactory實例化其引用的作業類。 默認的JobFactory僅在作業類上調用newInstance(),然後嘗試在該類上調用與JobDataMap中的鍵名匹配的setter方法。 您可能需要創建自己的JobFactory實現,以完成諸如使應用程序的IoC或DI容器生成/初始化作業實例之類的任務。

@PersistJobDataAfterExecution是可以添加到Job類的註釋,該註釋告訴Quartz在execute()方法成功完成(不引發異常)之後更新JobDetail的JobDataMap的存儲副本,以便下一次執行同一作業( JobDetail)接收更新的值,而不是原始存儲的值。 與@DisallowConcurrentExecution批註類似,此方法適用於作業定義實例,而不適用於作業類實例,儘管它決定讓作業類攜帶該屬性,因爲它通常會影響類的編碼方式(例如,“有狀態” 將需要由execute方法中的代碼明確地“理解”。

Job的屬性

1.持久性-如果作業不是持久的,那麼一旦不再有任何與之關聯的活動觸發器,它將自動從調度器中刪除。換句話說,非持久性工作的生命週期受到其觸發器的限制。

2.可恢復性-如果作業請求恢復,並且它是在調度器硬關閉期間執行的(例如,它在崩潰中運行的進程,或者機器被關閉),那麼它將在調度器再次啓動時重新執行。在這種情況下,jobexecutioncontext . is()方法將返回true。

 

JobExecutionException

允許從execute方法拋出的惟一類型的異常(包括RuntimeExceptions)是JobExecutionException。因此,通常應該用try-catch塊包裝execute方法的全部內容。您還應該花一些時間查看JobExecutionException的文檔,因爲您的作業可以使用它來爲調度器提供關於如何處理該異常的各種指令。

發佈了8 篇原創文章 · 獲贊 5 · 訪問量 9011
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章