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