Quartz.NET 是一個功能齊全的開源做業調度系統,可用於從最小的應用程序到大型企業系統。html
Quartz.NET是純淨的,它是一個.Net程序集,是很是流行的Java做業調度系統Quartz的C#實現。web
Quartz.NET不少特徵,如:數據庫支持,集羣,插件,支持cron-like表達式等等,很是適合在平時的工做中,定時輪詢數據庫同步,定時郵件通知,定時處理數據等。數據庫
Quartz.NET容許開發人員根據時間間隔(或天)來調度做業。它實現了做業和觸發器的多對多關係,還能把多個做業與不一樣的觸發器關聯。服務器
Quartz.NET的應用程序能夠重用來自不一樣事件的做業,還能夠爲一個事件組合多個做業。架構
我這次選擇Quartz.Net使用的版本是 3.3.3app
這裏強調一點:3.x的版本與2.x的版本使用方式有必定的差異ui
Quartz.NET官方文檔:https://www.quartz-scheduler.net/documentation/quartz-3.x/quick-start.html.net
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)); } }); } }
//Quartz的工做單元 services.AddTransient<RegularWork>();
從 Quartz.NET 3.3.2 開始,默認做業工廠生成的全部做業都是做用域做業,不該再使用UseMicrosoftDependencyInjectionScopedJobFactory。插件
AddJob-新增一個工做單元;StartNow表示做業如今就開始執行;code
WithInterval用於執行時間策略執行規則;
TimeSpan.FromSeconds表示執行的時間間隔,秒爲單位;RepeatForever表明重複工做,能夠用WithRepeatCount(5)代替RepeatForever;WithRepeatCount(5)表明執行5次
//Quartz調度中心 services.AddQuartz(q => { //用於注入 q.UseMicrosoftDependencyInjectionJobFactory(); // 基本Quartz調度器、做業和觸發器配置 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))//開始秒數 10s .RepeatForever())//持續工做 .WithDescription("My regular work trigger") ); });
// ASP.NET核心託管-添加Quartz服務器 services.AddQuartzServer(options => { // 關閉時,咱們但願做業正常完成 options.WaitForJobsToComplete = false; });
完整代碼以下
//Quartz的工做單元 services.AddTransient(); //Quartz調度中心 services.AddQuartz(q => { //用於注入 q.UseMicrosoftDependencyInjectionJobFactory(); // 基本Quartz調度器、做業和觸發器配置 var jobKey = new JobKey("RegularWork", "regularWorkGroup"); q.AddJob }); // ASP.NET核心託管-添加Quartz服務 services.AddQuartzServer(options => { // 關閉時,咱們但願做業正常完成 options.WaitForJobsToComplete = false; });(jobKey, j => j .WithDescription("My regular work") ); q.AddTrigger(t => t .WithIdentity("Trigger") .ForJob(jobKey) .StartNow() .WithSimpleSchedule(x => x.WithInterval(TimeSpan.FromSeconds(10))//開始秒數 10s .WithRepeatCount(5))//持續工做 .WithDescription("My regular work trigger") );
這時候咱們啓動項目,按期工做開始執行。這時候的注入是有效的,查詢數據後結果打印在F盤下的Quartz-NET.txt文件內(以下圖)。
官方的文檔介紹:https://www.quartz-scheduler.net/documentation/quartz-2.x/tutorial/crontrigger.html#format
由7段構成:秒 分 時 日 月 星期 年(可選)
"-" :表示範圍 MON-WED表示星期一到星期三
"," :表示列舉 MON,WEB表示星期一和星期三
"*" :表是「每」,每個月,天天,每週,每一年等
"/" :表示增量:0/15(處於分鐘段裏面) 每15分鐘,在0分之後開始,3/20 每20分鐘,從3分鐘之後開始
"?" :只能出如今日,星期段裏面,表示不指定具體的值
"L" :只能出如今日,星期段裏面,是Last的縮寫,一個月的最後一天,一個星期的最後一天(星期六)
"W" :表示工做日,距離給定值最近的工做日
"#" :表示一個月的第幾個星期幾,例如:"6#3"表示每月的第三個星期五(1=SUN...6=FRI,7=SAT)
Expression | Meaning |
---|---|
0 0 12 * * ? | 天天中午12點觸發 |
0 15 10 ? * * | 天天上午10:15觸發 |
0 15 10 * * ? | 天天上午10:15觸發 |
0 15 10 * * ? * | 天天上午10:15觸發 |
0 15 10 * * ? 2005 | 2005年的天天上午10:15觸發 |
0 * 14 * * ? | 在天天下午2點到下午2:59期間的每1分鐘觸發 |
0 0/5 14 * * ? | 在天天下午2點到下午2:55期間的每5分鐘觸發 |
0 0/5 14,18 * * ? | 在天天下午2點到2:55期間和下午6點到6:55期間的每5分鐘觸發 |
0 0-5 14 * * ? | 在天天下午2點到下午2:05期間的每1分鐘觸發 |
0 10,44 14 ? 3 WED | 每一年三月的星期三的下午2:10和2:44觸發 |
0 15 10 ? * MON-FRI | 週一至週五的上午10:15觸發 |
0 15 10 15 * ? | 每個月15日上午10:15觸發 |
0 15 10 L * ? | 每個月最後一日的上午10:15觸發 |
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觸發 |
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觸發 |
0 15 10 ? * 6#3 | 每個月的第三個星期五上午10:15觸發 |
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. |