C#基於Quartz.NET實現任務排程並部署Windows服務
一、Quartz.NET介紹
Quartz.NET是一個強大、開源、輕量的作業排程框架,是 OpenSymphony 的 Quartz API 的.NET移植,用C#改寫,可用於winform和asp.net mvc、.Net Core應用中。它靈活而不復雜。你能夠用它來為執行一個作業而建立簡單的或複雜的作業排程。它有很多特徵,如:資料庫支援,叢集,外掛,支援cron-like表示式等等。
官網:http://www.quartz-scheduler.net/
原始碼:https://github.com/quartznet/quartznet
二、Quartz.NET用途
一,可以定時發郵件通知。
二 , 電商網站的定時打折活動。(比如規定11月11日 淘寶購買女朋友打八折)
三, 定時對資料更新 或者新增。
四,自己朋友生日。 可以定時發生日祝福。 等等 (我也不一一舉例了)
三、Quartz.NET安裝
我使用的VS版本是2017的 選擇工具 - NuGet包管理 - 管理解決方案的NuGet包 輸入 Quartz.NET 安裝
還可以通過NuGet控制檯 通過安裝命令
Install-Package Quartz
四、Quartz.NET實現思路
一:繼承並實現IJob介面,在Execute 方法中寫你要定時執行的事情(切記 )
二:使用Quartz建立任務排程核心程式碼步驟
1、配置Quartz,建立工廠,開啟排程。
2、建立工作任務
3、建立觸發器
4、將任務加入到任務池
三:新增任務,使用Topshelf部署Windows服務,定時執行
五、程式碼步驟講解
一:繼承並實現IJob介面,在Execute 方法中寫你要做的事情(切記 )
1 using Quartz.Utility; 2 using System; 3 using System.IO; 4 using System.Threading.Tasks; 5 6 namespace Quartz.JobWork 7 { 8 public class MyJob : IJob 9 { 10 public Task Execute(IJobExecutionContext context) 11 { 12 Task task = null; 13 try 14 { 15 string fileName = "printlog.txt"; 16 StreamWriter writer = new StreamWriter(fileName, true); 17 task = writer.WriteLineAsync(string.Format("{0},測試", DateTime.Now.ToLongTimeString())); 18 writer.Close(); 19 writer.Dispose(); 20 } 21 catch (Exception ex) 22 { 23 LogHelper.WriteLog(ex.Message.ToString(), ex); 24 } 25 return task; 26 } 27 } 28 }
二:使用Quartz建立任務排程核心程式碼步驟
注:這裡提供一個QuartzHelper幫助類,直接把以下程式碼copy過去即可用,只需要重寫Execute方法即可。Quartz3.0及以上的版本是採用的非同步,3.0以下的版本沒有采用非同步,使用方法是一樣的
1 using Quartz.Impl; 2 using System; 3 using System.Collections.Generic; 4 using System.Collections.Specialized; 5 using System.Linq; 6 using System.Text; 7 using System.Threading; 8 using System.Threading.Tasks; 9 10 namespace Quartz.Utility 11 { 12 public class QuartzHelper 13 { 14 static readonly IScheduler _scheduler; 15 static QuartzHelper() 16 { 17 var properties = new NameValueCollection(); 18 // 設定執行緒池 19 properties["quartz.threadPool.type"] = "Quartz.Simpl.SimpleThreadPool, Quartz"; 20 //設定執行緒池的最大執行緒數量 21 properties["quartz.threadPool.threadCount"] = "5"; 22 //設定作業中每個執行緒的優先順序 23 properties["quartz.threadPool.threadPriority"] = ThreadPriority.Normal.ToString(); 24 25 // 遠端輸出配置 26 properties["quartz.scheduler.exporter.type"] = "Quartz.Simpl.RemotingSchedulerExporter, Quartz"; 27 properties["quartz.scheduler.exporter.port"] = "555"; //配置埠號 28 properties["quartz.scheduler.exporter.bindName"] = "QuartzScheduler"; 29 properties["quartz.scheduler.exporter.channelType"] = "tcp"; //協議型別 30 31 //建立一個工廠 32 var schedulerFactory = new StdSchedulerFactory(properties); 33 //啟動 34 _scheduler = schedulerFactory.GetScheduler().Result; 35 //1、開啟排程 36 _scheduler.Start(); 37 } 38 /// <summary> 39 /// 時間間隔執行任務 40 /// </summary> 41 /// <typeparam name="T">任務類,必須實現IJob介面</typeparam> 42 /// <param name="seconds">時間間隔(單位:秒)</param> 43 public static async Task<bool> ExecuteInterval<T>(int seconds) where T : IJob 44 { 45 //2、建立工作任務 46 IJobDetail job = JobBuilder.Create<T>().Build(); 47 // 3、建立觸發器 48 ITrigger trigger = TriggerBuilder.Create() 49 .StartNow() 50 .WithSimpleSchedule( 51 x =>x.WithIntervalInSeconds(seconds) 52 //x.WithIntervalInMinutes(1) 53 .RepeatForever()) 54 .Build(); 55 //4、將任務加入到任務池 56 await _scheduler.ScheduleJob(job, trigger); 57 return true; 58 } 59 60 /// <summary> 61 /// 指定時間執行任務 62 /// </summary> 63 /// <typeparam name="T">任務類,必須實現IJob介面</typeparam> 64 /// <param name="cronExpression">cron表示式,即指定時間點的表示式</param> 65 public static async Task<bool> ExecuteByCron<T>(string cronExpression) where T : IJob 66 { 67 //2、建立工作任務 68 IJobDetail job = JobBuilder.Create<T>().Build(); 69 //3、建立觸發器 70 ICronTrigger trigger = (ICronTrigger)TriggerBuilder.Create() 71 .StartNow() 72 .WithCronSchedule(cronExpression) 73 .Build(); 74 //4、將任務加入到任務池 75 await _scheduler.ScheduleJob(job, trigger); 76 return true; 77 } 78 } 79 }
三:新增任務,Topshelf部署Windows服務,定時執行
1 namespace Quartz 2 { 3 public class Program 4 { 5 static void Main(string[] args) 6 { 7 //string cronExpression = "0 0 8,23 * * ? "; //=>這是指每天的9點和16點執行任務 8 //cronExpression = "30 0/1 * * * ?"; 9 //QuartzHelper.ExecuteByCron<MyJob>(cronExpression).Wait(); //=>這是呼叫Cron計劃方法 10 QuartzHelper.ExecuteInterval<MyJob>(180).Wait(); 11 /* 12 簡單說一下Cron表示式吧, 13 14 由7段構成:秒 分 時 日 月 星期 年(可選) 15 16 "-" :表示範圍 MON-WED表示星期一到星期三 17 "," :表示列舉 MON,WEB表示星期一和星期三 18 "*" :表是“每”,每月,每天,每週,每年等 19 "/" :表示增量:0/15(處於分鐘段裡面) 每15分鐘,在0分以後開始,3/20 每20分鐘,從3分鐘以後開始 20 "?" :只能出現在日,星期段裡面,表示不指定具體的值 21 "L" :只能出現在日,星期段裡面,是Last的縮寫,一個月的最後一天,一個星期的最後一天(星期六) 22 "W" :表示工作日,距離給定值最近的工作日 23 "#" :表示一個月的第幾個星期幾,例如:"6#3"表示每個月的第三個星期五(1=SUN...6=FRI,7=SAT) 24 25 如果Minutes的數值是 '0/15' ,表示從0開始每15分鐘執行 26 27 如果Minutes的數值是 '3/20' ,表示從3開始每20分鐘執行,也就是‘3/23/43’ 28 */ 29 HostFactory.Run(x => 30 { 31 x.UseLog4Net(); 32 x.Service<TownCrier>(s => //2 33 { 34 s.ConstructUsing(name => new TownCrier()); //3 35 s.WhenStarted(tc => tc.Start()); //4 36 s.WhenStopped(tc => tc.Stop()); //5 37 }); 38 x.RunAsLocalSystem(); 39 x.SetDescription("QuartzJob任務定時傳送"); 40 x.SetDisplayName("QuartzJob"); 41 x.SetServiceName("QuartzJob"); 42 43 x.EnablePauseAndContinue(); 44 }); 45 } 46 } 47 }
最後就可以做自己想要做的事情了!
下期講解使用Topshelf部署Windows服務!
&n