Quartz.NET的具體使用
一、什么是Quartz.NET?
Quartz.NET 是一個功能齊全的開源作業(yè)調(diào)度系統(tǒng),可用于從最小的應(yīng)用程序到大型企業(yè)系統(tǒng)。
Quartz.NET是純凈的,它是一個.Net程序集,是非常流行的Java作業(yè)調(diào)度系統(tǒng)Quartz的C#實現(xiàn)。
二、Quartz.NET可以做什么?
Quartz.NET很多特征,如:數(shù)據(jù)庫支持,集群,插件,支持cron-like表達(dá)式等等,非常適合在平時的工作中,定時輪詢數(shù)據(jù)庫同步,定時郵件通知,定時處理數(shù)據(jù)等。
Quartz.NET允許開發(fā)人員根據(jù)時間間隔(或天)來調(diào)度作業(yè)。它實現(xiàn)了作業(yè)和觸發(fā)器的多對多關(guān)系,還能把多個作業(yè)與不同的觸發(fā)器關(guān)聯(lián)。
Quartz.NET的應(yīng)用程序可以重用來自不同事件的作業(yè),還可以為一個事件組合多個作業(yè)。
我此次選擇Quartz.Net使用的版本是 3.3.3
這里強調(diào)一點:3.x的版本與2.x的版本使用方式有一定的差別
Quartz.NET官方文檔:https://www.quartz-scheduler.net/documentation/quartz-3.x/quick-start.html
三、ASP.NET Core如何使用Quartz.NET?
首先我們需要創(chuàng)建一個ASP.NET Core web的項目,創(chuàng)建的過程就不展示了,我創(chuàng)建的是API項目,使用傳統(tǒng)三層架構(gòu)。
項目創(chuàng)建好后,我們需要在NuGet包管理器中安裝Quartz.AspNetCore和Quartz.Extensions.DependencyInjection
與2.x的使用方式不同,因為我使用的版本是3.3.3(此時最新版本)。我們就不像傳統(tǒng)的創(chuàng)建調(diào)度中心類。傳統(tǒng)的是定義作業(yè)工廠類【ResetJobFactory】,控制中心類【SchedulerCenter】,以及定期工作類【RegularWork】(如下圖)在這就不過多介紹了。
只需創(chuàng)建一個定期工作類【RegularWork】,并且繼承Quartz.net的IJob接口,I_RegularWork_BLL能注入到RegularWork內(nèi)需要UseMicrosoftDependencyInjectionJobFactory.
public class RegularWork : IJob { private readonly I_RegularWork_BLL I_bll; public RegularWork(I_RegularWork_BLL Ibll) { I_bll = Ibll; } public Task Execute(IJobExecutionContext context) { Input_RoomType model = new Input_RoomType(); model.currentPage = 1; model.pageSize = 1; var result = I_bll.getRoomTypeList(model); return Task.Run(() => { using (StreamWriter sw = new StreamWriter(@"F:/Quartz-NET.txt", true, Encoding.UTF8)) { sw.WriteLine(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss:fff =>") + JsonConvert.SerializeObject(result)); } }); } }
在Startup.cs的ConfigureServices方法內(nèi)通過services去注冊RegularWork
//Quartz的工作單元 services.AddTransient<RegularWork>();
ConfigureServices方法內(nèi)新增Quartz調(diào)度中心。Quartz.Extensions.DependencyInjection提供與Microsoft 依賴注入的集成,雖然Quartz 為作業(yè)工廠提供了兩個內(nèi)置替代方案,可以通過調(diào)用UseMicrosoftDependencyInjectionJobFactory或UseMicrosoftDependencyInjectionScopedJobFactory(已棄用)進行配置。
從 Quartz.NET 3.3.2 開始,默認(rèn)作業(yè)工廠生成的所有作業(yè)都是作用域作業(yè),不應(yīng)再使用UseMicrosoftDependencyInjectionScopedJobFactory。
AddJob-新增一個工作單元;StartNow表示作業(yè)現(xiàn)在就開始執(zhí)行;
WithInterval用于執(zhí)行時間策略執(zhí)行規(guī)則;
TimeSpan.FromSeconds表示執(zhí)行的時間間隔,秒為單位;RepeatForever代表重復(fù)工作,可以用WithRepeatCount(5)代替RepeatForever;WithRepeatCount(5)代表執(zhí)行5次
//Quartz調(diào)度中心 services.AddQuartz(q => { //用于注入 q.UseMicrosoftDependencyInjectionJobFactory(); // 基本Quartz調(diào)度器、作業(yè)和觸發(fā)器配置 var jobKey = new JobKey("RegularWork", "regularWorkGroup"); q.AddJob<RegularWork>(jobKey, j => j .WithDescription("My regular work") ); q.AddTrigger(t => t .WithIdentity("Trigger") .ForJob(jobKey) .StartNow() .WithSimpleSchedule(x => x.WithInterval(TimeSpan.FromSeconds(10))//開始秒數(shù) 10s .RepeatForever())//持續(xù)工作 .WithDescription("My regular work trigger") ); });
ConfigureServices方法內(nèi)新增添加Quartz服務(wù)
// ASP.NET核心托管-添加Quartz服務(wù)器 services.AddQuartzServer(options => { // 關(guān)閉時,我們希望作業(yè)正常完成 options.WaitForJobsToComplete = false; });
完整代碼
//Quartz的工作單元 services.AddTransient(); //Quartz調(diào)度中心 services.AddQuartz(q => { //用于注入 q.UseMicrosoftDependencyInjectionJobFactory(); // 基本Quartz調(diào)度器、作業(yè)和觸發(fā)器配置 var jobKey = new JobKey("RegularWork", "regularWorkGroup"); q.AddJob(jobKey, j => j .WithDescription("My regular work") ); q.AddTrigger(t => t .WithIdentity("Trigger") .ForJob(jobKey) .StartNow() .WithSimpleSchedule(x => x.WithInterval(TimeSpan.FromSeconds(10))//開始秒數(shù) 10s .WithRepeatCount(5))//持續(xù)工作 .WithDescription("My regular work trigger") ); }); // ASP.NET核心托管-添加Quartz服務(wù) services.AddQuartzServer(options => { // 關(guān)閉時,我們希望作業(yè)正常完成 options.WaitForJobsToComplete = false; });
這時候我們啟動項目,定期工作開始執(zhí)行。這時候的注入是有效的,查詢數(shù)據(jù)后結(jié)果打印在F盤下的Quartz-NET.txt文件內(nèi)(如下圖)。
四、Quartz的cron表達(dá)式
官方的文檔介紹:https://www.quartz-scheduler.net/documentation/quartz-2.x/tutorial/crontrigger.html
由7段構(gòu)成:秒 分 時 日 月 星期 年(可選)
"-" :表示范圍 MON-WED表示星期一到星期三
"," :表示列舉 MON,WEB表示星期一和星期三
"*" :表是“每”,每月,每天,每周,每年等
"/" :表示增量:0/15(處于分鐘段里面) 每15分鐘,在0分以后開始,3/20 每20分鐘,從3分鐘以后開始
"?" :只能出現(xiàn)在日,星期段里面,表示不指定具體的值
"L" :只能出現(xiàn)在日,星期段里面,是Last的縮寫,一個月的最后一天,一個星期的最后一天(星期六)
"W" :表示工作日,距離給定值最近的工作日
"#" :表示一個月的第幾個星期幾,例如:"6#3"表示每個月的第三個星期五(1=SUN...6=FRI,7=SAT)
Expression | Meaning |
---|---|
0 0 12 * * ? | 每天中午12點觸發(fā) |
0 15 10 ? * * | 每天上午10:15觸發(fā) |
0 15 10 * * ? | 每天上午10:15觸發(fā) |
0 15 10 * * ? * | 每天上午10:15觸發(fā) |
0 15 10 * * ? 2005 | 2005年的每天上午10:15觸發(fā) |
0 * 14 * * ? | 在每天下午2點到下午2:59期間的每1分鐘觸發(fā) |
0 0/5 14 * * ? | 在每天下午2點到下午2:55期間的每5分鐘觸發(fā) |
0 0/5 14,18 * * ? | 在每天下午2點到2:55期間和下午6點到6:55期間的每5分鐘觸發(fā) |
0 0-5 14 * * ? | 在每天下午2點到下午2:05期間的每1分鐘觸發(fā) |
0 10,44 14 ? 3 WED | 每年三月的星期三的下午2:10和2:44觸發(fā) |
0 15 10 ? * MON-FRI | 周一至周五的上午10:15觸發(fā) |
0 15 10 15 * ? | 每月15日上午10:15觸發(fā) |
0 15 10 L * ? | 每月最后一日的上午10:15觸發(fā) |
0 15 10 L-2 * ? | Fire at 10:15am on the 2nd-to-last last day of every month |
0 15 10 ? * 6L | 每月的最后一個星期五上午10:15觸發(fā) |
0 15 10 ? * 6L | Fire at 10:15am on the last Friday of every month |
0 15 10 ? * 6L 2002-2005 | 2002年至2005年的每月的最后一個星期五上午10:15觸發(fā) |
0 15 10 ? * 6#3 | 每月的第三個星期五上午10:15觸發(fā) |
0 0 12 1/5 * ? | Fire at 12pm (noon) every 5 days every month, starting on the first day of the month. |
0 11 11 11 11 ? | Fire every November 11th at 11:11am. |
到此這篇關(guān)于Quartz.NET的具體使用的文章就介紹到這了,更多相關(guān)Quartz.NET使用內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
ASP.Net WebAPI與Ajax進行跨域數(shù)據(jù)交互時Cookies數(shù)據(jù)的傳遞
本文主要介紹了ASP.Net WebAPI與Ajax進行跨域數(shù)據(jù)交互時Cookies數(shù)據(jù)傳遞的相關(guān)知識。具有很好的參考價值。下面跟著小編一起來看下吧2017-05-05ASP.NET下母版頁和內(nèi)容頁中的事件發(fā)生順序整理
母版頁與內(nèi)容頁合并后事件的發(fā)生順序,有需要區(qū)別的朋友能用的到2009-03-03ASP.NET中的Inherits、CodeFile、CodeBehind的區(qū)別詳解
這篇文章主要介紹了ASP.NET中的Inherits、CodeFile、CodeBehind的區(qū)別詳解,需要的朋友可以參考下2014-07-07實現(xiàn)DataGridView控件中CheckBox列的使用實例
最近做WindowsForms程序,使用DataGridView控件時,加了一列做選擇用,發(fā)現(xiàn)CheckBox不能選中。搜索后,要實現(xiàn)DataGridView的CellContentClick事件,將代碼貼一下2014-01-01