Quartz.NET 2.x 文件翻譯 - Lesson 2:Jobs 和 Triggers

龐順龍發表於2019-05-11

Quartz.NET 2.x 文件翻譯 - Lesson 2:Jobs 和 Triggers 檢視官網原文

返回目錄

The Quartz API

Quartz API 的介面和類主要有:

  1. IScheduler - scheduler排程的主要介面api
  2. IJob - scheduler排程執行job需要實現的介面api
  3. IJobDetail - 用來定義jobs的例項
  4. ITrigger - 定義需要執行的job的排程構成
  5. JobBuilder - 用於定義/建立job的明細情況,定義job的例項
  6. TriggerBuilder - 用於定義/建立Trigger的例項

下面主要用到的關鍵詞術語有:IScheduler 和 Scheduler,IJob 和 Job,IJobDetail 和 JobDetail,ITrigger 和 Trigger.。

一個Scheduler排程的生命週期開始於它的建立,結束於它的關閉,這些都是通過SchedulerFactory 實現的。當我們建立了IScheduler介面後,我們就可以用來add、remove、或者list jobs和triggers,或者是其他與排程相關的工作。但是需要注意的是,我們必須首先start排程,否則job和trigger都是不會開始工作的。

quartz提供了“builder”類,用於定義一個域的特定語言。上一章有一個簡單的demo程式碼:

// define the job and tie it to our HelloJob class
IJobDetail job = JobBuilder.Create<HelloJob>()
  .WithIdentity("myJob", "group1") // name "myJob", group "group1"
  .Build();
  
// Trigger the job to run now, and then every 40 seconds
ITrigger trigger = TriggerBuilder.Create()
  .WithIdentity("myTrigger", "group1")
  .StartNow()
  .WithSimpleSchedule(x => x
    .WithIntervalInSeconds(40)
    .RepeatForever())            
  .Build();
  
// Tell quartz to schedule the job using our trigger
sched.scheduleJob(job, trigger);

這段程式碼使用JobBuilder建立了一個job定義,同樣的IJobDetail程式碼塊用TriggerBuilder 建立了trigger的定義,同時定義了方法的特定type型別。schedule 排程的方法有:

  1. WithCalendarIntervalSchedule
  2. WithCronSchedule
  3. WithDailyTimeIntervalSchedule
  4. WithSimpleSchedule

使用DateBuilder可以輕鬆的構建特定的執行時間點等,如下個小時、十點鐘、或者是其他的具體時間方式。

Jobs and Triggers

一個job就是一個實現了IJob介面的類,如下為IJob介面的唯一方法:

namespace Quartz
{
    public interface IJob
    {
        void Execute(JobExecutionContext context);
    }
}

當 Job的trigger被觸發後,Execute方法就會被scheduler排程的執行緒請求,JobExecutionContext包含執行環境引數等資訊 被傳遞給execute方法用於Scheduler排程執行job例項任務,一個trigger觸發器被觸發執行此job任務。

JobDetail 物件是由Quartz.NET客戶端程式(就是你建立的專案)將job被新增到scheduler排程的時候建立的。它包含了job的各種屬性設定資訊,好比一個job的資料地圖一樣,它儲存了job例項的狀態資訊等。這其實就是job例項的定義資訊,在下一章我們在細聊。

Trigger物件是用於job任務的執行觸發。當我們想要schedule排程一個job任務的時候,需要例項化一個Trigger然後配置好屬性引數用於執行我們想要的排程。Trigger也許也有類似的資料地圖,用於將引數資訊傳遞給job任務當Trigger被觸發的時候。Quartz 包含了很多的Trigger觸發型別,但是經常用到的型別是SimpleTrigger(ISimpleTrigger介面CronTrigger(ICronTrigger介面

SimpleTrigger很容易實現一次性的job執行配置(就是在單一事件執行一次job任務),或者是在你需要執行的時間點執行並重復N次,只需要設定好執行間隔時間即可。CronTrigger主要用於特定時間點或者週期性質的執行間隔,如每週一或者每個月的第四天等等。

為什麼使用job和Trigger這樣分開獨立的方式?很多的schedulers排程job作業並沒有job和Trigger的概念。有些定義一個job僅僅是用來執行一個時間點job的標示而已。其他的則更像是quartz job的合集。然而在我們開發Quartz的時候,認為分離schedule排程和work工作還是很有必要的,有很多的好處。

比如說:job可以建立並儲存在獨立的scheduler排程中並Trigger觸發,許多的Trigger觸發器都可以觸發相同的job任務。這種鬆耦合的另外一個好處就是相關Trigger觸發器過期後,配置在scheduler排程中的job任務任然是可以使用的,這樣這些job任務仍然可以繼續被scheduler排程使用,而不需要我們重新定義新的job任務,我們還可以修改或者替換Trigger觸發器來繼續工作而不需要去重新定義新的job任務。

Identities

job和Trigger是有各自的識別key值註冊在quartz的scheduler排程中的。這些job任務的key和Trigger觸發器的key是可以放到一個group組的,這樣我們就可以實現一個類別的組任務集合,比如一個彙報工作的組任務等等。

到目前為止,我們就瞭解了什麼是job任務和Trigger觸發器了,在第三章和第四章將會講解更多相關內容。

返回目錄

龐順龍最後編輯於:3年前

內容均為作者獨立觀點,不代表八零IT人立場,如涉及侵權,請及時告知。

相關文章