1. 程式人生 > 程式設計 >Quartz.Net任務和觸發器實現方法詳解

Quartz.Net任務和觸發器實現方法詳解

Quartz API

Quartz API的主要介面和類如下:

  • IScheduler - 和排程器互動的主要API
  • IJob - 排程器會執行實現這個介面的例項
  • IJobDetail - 用來定義任務的例項
  • ITrigger - 定義任務執行安排的元件
  • JobBuilder - 用來定義/構造JobDetail的例項,其中JobDetail的例項定義Jobs的例項
  • TriggerBuilder - 用來定義/構造Trigger的例項

在本文中,為了可讀性,下列說法可互換: IScheduler 和 Scheduler,IJob 和 Job,IJobDetail 和 JobDetail,ITrigger 和

Trigger.

一個排程器的生命週期,從通過SchedulerFactory建立開始,到呼叫它的Shutdown()方法結束。一個IScheduler實現後,可以使用新增、刪除、列出任務和觸發器,或者其他排程相關的操作(例如暫停一個觸發器)。然而,如Lesson 1裡講到的,一個排程器不會真正觸發任務觸發器(執行任務)直到呼叫 Start()方法啟動它。

Quartz提供定義為領域特定語言(DSL,有時稱為“流介面(fluent interface)”)的“構建者(builder)”類。在上一課中,你看到了它的一個例子,在這裡我們再看其中一部分。

	// 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
	await sched.scheduleJob(job,trigger);

這段程式碼中,使用JobBuilder定義job時,使用了流介面去構建IJobDetail。同樣,使用TriggerBuilder定義trigger時,使用了流介面和返回trigger型別的擴充套件方法。可用的的排程擴充套件方法有:

  • WithCalendarIntervalSchedule
  • WithCronSchedule
  • WithDailyTimeIntervalSchedule
  • WithSimpleSchedule

DateBuilder 類提供了多種方法以便於構造 DateTimeOffset 例項來指定特定時間點(例如,指定為下個小時的時間 - 換句話說,如果現在是9:43:27,指定的時間就是10:00:00)。

Jobs and Triggers

任務是一個實現了IJob介面的類,它只有一個簡單的方法。

IJob 介面

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

當任務的觸發器觸發時,排程器的其中一個工作執行緒會呼叫Execute(..)方法。傳遞給這個方法的JobExecutionContext物件提供了包含它的“執行時(run-time)”環境資訊的job例項,這些資訊包括訪問執行它的排程器的控制代碼,觸發這個操作的觸發器的控制代碼,任務的JobDetail物件,和一些其他資訊。

JobDetail物件是 Quartz.NET 客戶(client)(你的程式)把任務加入到排程器時產生的。它包括了多種Job的屬性,而且提供了JobDataMap,它可以為job類的例項儲存狀態資訊。這就是job例項的本質,下一節中會更詳細的介紹。

觸發器物件用來觸發任務的執行。當你想排程一個任務時,應例項化一個觸發器並“調整”它的屬性以滿足你希望的排程安排。觸發器還可以擁有與其關聯的JobDataMap物件,這對傳遞引數給任務是非常有用的。Quartz提供了幾種不同型別的觸發器,但應用最多的是SimpleTrigger(ISimpleTrigger介面)和CronTrigger(ICronTrigger介面)。

如果你需要“一次性”操作(在指定時間只進行一次操作),或者在指定時間進行一次任務,並在延遲時間執行N次,那麼用SimpleTrigger是非常方便的。如果你觸發任務基於像日曆一樣的計劃,例如“每週五,中午”或“每月10號10:15”,那麼CronTrigger是非常有用的。

為什麼分開用任務和觸發器?許多工排程器裡沒有分開的任務和觸發器的概念。其中一些簡單定義一個“任務”為有簡單任務標誌符的一個執行時間(計劃),其他的很像Quartz的任務和觸發器綜合到一起的概念。開發Quartz時,我們決定把計劃和在計劃中進行的工作分開是非常有意義的。這有很多好處(我們覺得)。

例如,任務可以獨立於觸發器,建立並存儲在任務計劃中,並且多個觸發器可以與同一個任務關聯。另一個低耦合的好處是,可以配置那些關聯的觸發器已經過期,但仍然在排程器裡的任務,這使得之後不用重新定義就可以再次排程它。這同樣允許你修改或替換一個觸發器,而不用重新定義與它關聯的任務。

Identities

任務和觸發器在註冊到Quartz排程器時可以給定標識鍵。任務和觸發器的鍵(JobKey and TriggerKey)使得它們可以分組,方便分類規劃你的任務和觸發器,例如“報告任務”和“維護任務”。在同一組內任務和觸發器的名稱(name)屬性必須是唯一的。話句話說,任務和觸發器的完整鍵(標識),即名稱(name)和組(group)的組合是惟一的。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。