Quartz.NET作為一款定時框架,它的最小可運行程式如下: var scheduler = StdSchedulerFactory.GetDefaultScheduler(); scheduler.Start(); //Job執行的任務 var job = JobBuilder.Create<M ...
Quartz.NET作為一款定時框架,它的最小可運行程式如下:
var scheduler = StdSchedulerFactory.GetDefaultScheduler();
scheduler.Start();
//Job執行的任務
var job = JobBuilder.Create<MyJob>().Build();
//Schedule計劃表,可以設置調用次數,調用間隔
//Trigger觸發器,可以設置調用開始,結束時間,優先順序
var trigger = TriggerBuilder.Create().WithSimpleSchedule(
m => m.WithIntervalInSeconds(1).WithRepeatCount(1))
.StartNow()//.EndAt(DateTimeOffset.Now.AddSeconds(10))
.Build();
scheduler.ScheduleJob(job, trigger);
它有兩個核心要素:Job和Trigger,Job用於通過實現了IJob介面的泛型即PublishJob告訴框架做什麼,而Trigger告訴框架何時做。
MyJob類:
/// <summary>
/// 自定義任務
/// </summary>
public class MyJob : IJob
{
public void Execute(IJobExecutionContext context)
{
//實現具體的業務邏輯
}
}
Job常用方法
UsingJobData(key, value)方法
通過這個方法可以給具體的任務實現類即上面的MyJob傳值,例如: context.JobDetail.JobDataMap["count"]
WithDescription(description)方法
用於描述Job的名稱,業務邏輯,我一開始還很奇怪任務的名稱和業務邏輯完全可以在代碼中描述,為何還要有這個方法,原來這個方法的使用場景是:自定義定時任務框架,比如開發一套類似於Windows定時任務的工具。
WithIdentity(name)
給JobKey命名,JobKey是JobBuilder的一個屬性,它的底層代碼如下:
public JobBuilder WithIdentity(string name)
{
//new一個JobKey,name是key的名稱,group名稱是null
key = new JobKey(name, null);
return this;
}
StoreDurably(durability)
是否持久化(預設當沒有Trigger指向Job時,Job會被刪掉)
SetJobData(newJobDataMap)
給JobDataMap設置一個新的對象,這個方法與上面的UsingJobData方法區別在於一個是給JobDataMap添加值,一個是重新給這個對象賦值,它們的底層代碼如下。
SetJobData:
public JobBuilder SetJobData(JobDataMap newJobDataMap)
{
jobDataMap = newJobDataMap;
return this;
}
UsingJobData:
public JobBuilder UsingJobData(string key, string value)
{
jobDataMap.Put(key, value);
return this;
}
Trigger常用方法
StartAt(startTimeUtc) 方法
設置觸發器開始執行的時間,這個參數是可以設置時區的。
Quartz.NET框架自身還封裝了一個日期工具類DateBuilder,它實現類很多返回下一分鐘(小時,天等)方法,它與StartAt能夠很好地配合。
例如:
DateBuilder.EvenMinuteDateAfterNow(); 返回現在時刻地下一分鐘,例如:現在的時間是12點29分20秒,它會返回12點30分00秒
EndAt(endTimeUtc) 方法
與StartAt對應的是EndAt方法,它用於設置觸發器的關閉時間
WithSimpleSchedule(action) 方法
創建了一個簡單的執行計劃,可以設置執行次數,頻率等,這個方法是最常用的,我們熟悉的Timer定時器就類似於這個。
它的參數是一個委托Action<SimpleScheduleBuilder>,我們就是通過調用SimpleScheduleBuilder的方法來設置執行次數&間隔時間的。
WithDailyTimeIntervalSchedule(action) 方法
創建一個功能更強的執行計劃,它可以設置每天幾點到幾點執行,工作日執行或只在周末執行,在執行了幾次後停止,在某一個星期執行,設置執行頻率等。
它的參數是一個委托Action<DailyTimeIntervalScheduleBuilder>,我們就是通過調用DailyTimeIntervalScheduleBuilder的方法來設置執行策略的。
WithCronSchedule(cronExpression)方法
通過Corn表達式來設置執行計劃,這種方式與上面兩種的優點在於我們可以不再通過硬編碼的方式來設置執行策略,而是通過字元串來控制執行策略。
語法如下:
//秒 分 時 天 月 年 周
//1. 天或者周必須有一個是?(?表示模糊)
//2. * 表示所有值即,秒位為*表示每秒執行一次
//3. - 表示範圍,分鐘位為10-12表示每個小時的10,11,12分執行一次
//4. , 表示每個值即,分鐘位為10,20,30表示每個小時的10,20,30分執行一次
//5. / 表示遞增,秒位為0/5表示0,5,10,15,20,25,30,35,40,45,50,55秒執行一次