1. 程式人生 > >C#基於Quartz.NET實現任務排程並部署Windows服務

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