第二課:QuartzAPI,Jobs和Triggers簡介
Quartz API
Quartz API 關鍵的幾個接口:
Scheduler:跟任務調度相關的最主要的API接口。
Job:你期望任務調度執行的組件定義(調度器執行的內容),都必須實現該接口。
JobDetail:用來定義Job的實例。
Trigger:定義一個指定的Job何時被執行的組件,也叫觸發器。
JobBuilder:用來定義或創建JobDetail的實例,JobDetail限定了只能是Job的實例。
TriggerBuilder:用來定義或創建觸發器的實例。
調度器的生命周期,起始於SchedulerFactory的創建,終止於調用shutdown方法。當調度器接口實例創建完成后,就可以添加,刪除和查詢Jobs和Triggers對象,也可以執行其它的跟調度器相關的操作,比如中止觸發器的觸發。並且,調度器在調用start方法之前,不會觸發任何一個觸發器去執行作業任務,如第一課所示的例子。
Quartz框架提供許多構造器類來定義一套領域特定語言,簡稱DSL,有時候也稱為“流接口”。在上一課中我們看到的示例,現在重新展示一部分代碼如下:
1 // define the job and tie it to our HelloJob class 2 IJobDetail job = JobBuilder.Create<HelloJob>() 3 .WithIdentity("myJob", "group1") // name "myJob", group "group1" 4 .Build(); 5 6 // Trigger the job to run now, and then every 40 seconds 7 ITrigger trigger = TriggerBuilder.Create() 8 .WithIdentity("myTrigger", "group1") 9 .StartNow() 10 .WithSimpleSchedule(x => x 11 .WithIntervalInSeconds(40) 12 .RepeatForever()) 13 .Build(); 14 15 // Tell quartz to schedule the job using our trigger 16 sched.scheduleJob(job, trigger);
上面的代碼,使用JoBuilder創建了IJobDetail對象,同樣,TriggerBuilder創建了ITrigger對象。IJobDetail:定義工作的使用,ITrigger:定義觸發器。
其他的擴展方法:
WithCalendarIntervalSchedule
WithCronSchedule
WithDailyTimeIntervalSchedule
WithSimpleSchedule
功能各樣的Schedule類提供多種方法來定義不同類型的調度器。
DateBuilder類包含了許多方法可以更簡捷地構建Date實例對象,尤其針對特定的時間點,比如下一個的整點時間,換言之現在是9:43:27,我需要得到10:00:00的時間對象。
Jobs和Triggers
作業任務類實現Job接口,只有一個方法
IJob接口
1 namespace Quartz 2 { 3 public interface IJob 4 { 5 void Execute(JobExecutionContext context); 6 } 7 }
當作業任務的觸發器被觸發的那一刻,調度器的一個工作線程,將會調用該Job的execute方法。JobExecutionContext對象會向execute方法傳遞運行時環境的工作任務信息:執行該方法的調度器引用,觸發該方法執行的觸發器引用,Job實例的JobDetail對象,以及一些其它信息。
當調度器添加Job實例時,會在Quartz客戶端程序中(咱們自己開發的代碼)創建JobDetail對象。JobDetail為Job實例提供了許多設置屬性,以及JobDataMap成員變量屬性,它用來存儲特定Job實例的狀態信息。這是從本質上定義Job實例,我們將會在下一節中深入地討論相關的細節。
觸發器對象用來觸發Job對象的執行,當你希望調度一項作業任務,你可以實例化一個觸發器並且將觸發時間屬性調整為你期望的時間表。觸發器也可以關聯JobDataMap對象,可以非常方便地將具體的被觸發的觸發器當作參數傳遞給Job實例。
Quartz框架附帶少數不同類型的觸發器,但最常用的類型是SimpleTrigger和CronTrigger。
SimpleTrigger適用於一次性的任務執行(在給定的時間段只執行一次的作業任務),或者你需要在指定時間多次觸發作業任務,每次觸發都延遲固定的時間。CronTrigger適用於基於類似日歷時間表的觸發,比如“每個周五的下午”或是“每月10號的10:15”。
為什么要分別定義作業任務和觸發器?許多作業調度並沒有區分作業任務和觸發器的概念。有些框架把作業任務簡單定義成執行時間(或計划)以及一些小作業標識符,其他框架更像是整合了Quartz框架的作業和觸發器對象。因此我們設計Quartz時,我們決定構建調度器時拆分開調度和任務是有意義的,在我看來,這樣做還是有許多好處。
例如,作業任務可以獨立於觸發器在作業調度中創建和存儲,多個觸發器可以關聯到相同的作業任務中。另一個好處是在作業任務關聯的觸發器失效后,仍然能夠在調度器上松耦合地配置作業任務,因此該作業不需要重新定義,一段時間后能夠重新調度。它還允許你在不重新實例化關聯的作業任務下修改和替換觸發器。
Identites(標識符)
作業任務和觸發器被注冊到Quartz調度器時需要提供標識信息。這種標識信息(也稱作作業任務鍵和觸發器鍵)允許作業任務和觸發器按組存放,這樣可以很方便地將你的作業任務和觸發器分組,比如分為“報表類Job”和“維護類Job”。作業任務和觸發器的鍵的名稱部分在同一個組內必須唯一,換句話說,作業任務和觸發器的鍵(或標識符)的名字是由鍵名和組名共同組成的。
現在你對作業任務和觸發器有一個大概的了解了,你可以在“第三課 更多關於Jobs和JobDetails”和“第四課 更多關於Triggers”學到更多關於它們的知識。