前言: 你曾經需要應用執行一個任務嗎?比如現在有一個需求,需要每天在零點定時執行一些操作,那應該怎樣操作呢? 這個時候,如果你和你的團隊是用.NET編程的話,可以考慮使用Quartz.NET調度器。允許開發人員根據日期間隔來實現任務調度任務。非常適合在平時的工作中,定時輪詢資料庫同步,定時郵件通知, ...
前言:
你曾經需要應用執行一個任務嗎?比如現在有一個需求,需要每天在零點定時執行一些操作,那應該怎樣操作呢?
這個時候,如果你和你的團隊是用.NET編程的話,可以考慮使用Quartz.NET調度器。允許開發人員根據日期間隔來實現任務調度任務。非常適合在平時的工作中,定時輪詢資料庫同步,定時郵件通知,定時處理數據等。
Quartz一個開源的作業調度框架,是OpenSymphony 的 Quartz API的.NET移植每隔,基於C#寫成,可應用於winform、asp.net、asp.net core應用中。提供了巨大的靈活性,是一個更為強大,方便管理,集群部署的作業調度框架。
所以,有時候項目需要在不同時刻,執行一個或很多個不同的作業,你可以用它來完成執行創建簡單或複雜的任務調度。
導圖:
特性:
1:支持集群,作業分組,作業遠程管理。
2:自定義精細的時間觸發器,使用簡單,作業和觸發分離。
3:資料庫支持,可以寄宿Windows服務,WebSite,winform等。
概念:
Scheduler 作業調度器
所有的scheduler都應該由SchedulerFactory來創建
//創建scheduler Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
IJob 作業介面,繼承並實現Execute, 編寫執行的具體作業邏輯。
通過實現IJob介面來使你的.NET組件可以很簡單地被scheduler執行
public class ConsoleJob : IJob { public Task Execute(IJobExecutionContext context) { return Console.Out.WriteLineAsync($"執行作業"); } }
JobBuilder 根據設置,生成一個詳細作業信息(JobDetail)。
JobBuilder是一個建造者模式,鏈式建造。通過靜態方法構建一個JobBuilder實例,然後再調用類方法Build()創建一個IJobDetail的實現。
public static JobBuilder Create(Type jobType) { JobBuilder b = new JobBuilder(); b.OfType(jobType); return b; }
TriggerBuilder 根據規則,生產對應的Trigger,觸發器可以規劃執行任務
通過靜態方法構建一個TriggerBuilder實例,然後再調用類方法Build()創建一個ITrigger的實現。
public static TriggerBuilder Create() { return new TriggerBuilder(); }
根據任務設置觸發的開始時間和結束時間
/// <summary> /// 開始時間 /// </summary> /// <param name="startTimeUtc"></param> /// <returns></returns> public TriggerBuilder StartAt(DateTimeOffset startTimeUtc) { startTime = startTimeUtc; return this; } /// <summary> /// 結束時間 /// </summary> /// <param name="endTimeUtc"></param> /// <returns></returns> public TriggerBuilder EndAt(DateTimeOffset? endTimeUtc) { endTime = endTimeUtc; return this; }
步驟:
1、創建一個ISchedulerFactory,然後並且獲取 Scheduler
2、啟動 Scheduler
3、創建 job 任務
4、創建 trigger 觸發器
5、使用觸發器規劃執行任務
開始:
註意:
新建一個Quartz項目後,需要安裝下麵的程式包:
你可以用控制台命令的方式安裝
Install-Package Quartz
也可以使用下麵這種方式選擇安裝版本
一、創建一個scheduler的引用:
ISchedulerFactory schedFact = new StdSchedulerFactory(); IScheduler sched = await schedFact.GetScheduler();
二、啟動 scheduler:
await sched.Start();
三、實現IJob:
ConsoleJob.cs 實現IJob,在Execute方法里編寫要處理的業務邏輯,系統就會按照Quartz的配置,定時處理
/// <summary> /// 實現IJob,Execute方法里編寫要處理的業務邏輯 /// </summary> public class ConsoleJob : IJob { public Task Execute(IJobExecutionContext context) { return Console.Out.WriteLineAsync($"ConsoleJob執行工作 在當前時間{DateTime.Now}--上一次執行時間:{DateTime.Now.AddSeconds(-5)}"); } }
四、創建trigger:(建立一個某個時間點的觸發器,並且每5秒執行一次)
ITrigger trigger = TriggerBuilder.Create() .WithIdentity("trigger1", "group1") //觸發器 組 .WithSimpleSchedule(x => x.WithIntervalInSeconds(5).RepeatForever()) .Build();
五、觸發器執行任務:
await sched.ScheduleJob(job, trigger);
將幾個步驟整合後代碼如下:
/// <summary> /// 任務調度的使用過程 /// </summary> /// <returns></returns> public async static Task Run() { // 1.創建scheduler的引用 ISchedulerFactory schedFact = new StdSchedulerFactory(); IScheduler sched = await schedFact.GetScheduler(); //2.啟動 scheduler await sched.Start(); // 3.創建 job IJobDetail job = JobBuilder.Create<ConsoleJob>() .WithIdentity("job1", "group1") .Build(); // 4.創建 trigger (創建 trigger 觸發器) ITrigger trigger = TriggerBuilder.Create() .WithIdentity("trigger1", "group1") //觸發器 組 .WithSimpleSchedule(x => x.WithIntervalInSeconds(5).RepeatForever()) .Build(); // 5.使用trigger規劃執行任務job (使用觸發器規劃執行任務) await sched.ScheduleJob(job, trigger); }
運行:
間隔5秒執行一次後的效果:
附加:
這裡使用的quartz為3.x 版本,整個版本相對於2.0版本進行了大量的修改,正式支持了.NET Core 和async/await
引用張隊文章的內容:
總結:
1.其實在實際項目中,可以將上面的方法進行封裝處理,形成不同的任務,特別是處理多任務的時候,在不同的job中調用不同的trigger,後續會繼續完善開發
2.quartz還有更多的用法,可以參考資料:Quartz.Net官方文檔 和 Quartz.Net開源地址
3.項目源碼地址