標籤:ogg cto 表達 產生 檔案中 odi 架構 資料 執行個體
Quartz.NET Windows 服務樣本
想必大家在項目中處理簡單的後台持續任務或者定時觸發任務的時候均使用 Thread 或者 Task 來完成,但是項目中的這種需求一旦多了的話就得將任務調度引入進來了,那今天就簡單的介紹一下 Quartz.NET 基於 Windows 服務宿主是怎樣配置使用的。
Quartz.NET 是一個優秀的任務調度架構,移植於 Java 版的 Quartz 。
官網:http://www.quartz-scheduler.net
Github:https://github.com/quartznet/quartznet
樣本環境
- .Net 4.5.2
- Quartz 2.4.1
- Common.Logging 3.3.1
- log4net 2.0.5
- Common.Logging.Log4Net1213 3.3.1
源碼地址:https://github.com/Wlitsoft/QuartzNETWinServiceSample
配置
1. quartz.config
這個設定檔需要放在服務運行根目錄下,用於指定 quartz 的一些回合組態,比如調度名稱、線程池實現組件、線程池大小、任務設定檔路徑等。
1 # You can configure your scheduler in either <quartz> configuration section 2 # or in quartz properties file 3 # Configuration section has precedence 4 5 quartz.scheduler.instanceName = QuartzNETWinServiceScheduler 6 7 # configure thread pool info 8 quartz.threadPool.type = Quartz.Simpl.SimpleThreadPool, Quartz 9 quartz.threadPool.threadCount = 1010 quartz.threadPool.threadPriority = Normal11 12 # job initialization plugin handles our xml reading, without it defaults are used13 quartz.plugin.xml.type = Quartz.Plugin.Xml.XMLSchedulingDataProcessorPlugin, Quartz14 quartz.plugin.xml.fileNames = ~/Conf/jobs.config
暫時需求需要修改的只有一處,看最後一行 quartz.plugin.xml.fileNames = ~/Conf/jobs.config 指定任務的設定檔路徑。
2. 任務設定檔
1 <?xml version="1.0" encoding="UTF-8"?> 2 <!-- This file contains job definitions in schema version 2.0 format --> 3 <job-scheduling-data xmlns="http://quartznet.sourceforge.net/JobSchedulingData" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.0"> 4 5 <processing-directives> 6 <overwrite-existing-data>true</overwrite-existing-data> 7 </processing-directives> 8 9 <schedule>10 <job>11 <name>Job1</name>12 <group>Jobs</group>13 <description>任務1</description>14 <job-type>Wlitsoft.ProjectSample.QuartzNETWinService.Job.Job1,QuartzNETWinService</job-type>15 <durable>true</durable>16 <recover>false</recover>17 </job>18 <trigger>19 <simple>20 <name>Job1Trigger</name>21 <group>Jobs</group>22 <description>每 30 秒執行一次</description>23 <job-name>Job1</job-name>24 <job-group>Jobs</job-group>25 <repeat-count>-1</repeat-count>26 <repeat-interval>30000</repeat-interval>27 </simple>28 </trigger>29 </schedule>30 </job-scheduling-data>
以下為設定檔屬性:
- 任務 (job 節點)
| simple 節點項說明 |
| 名稱 |
類型 |
是否必填 |
預設值 |
描述 |
| name |
string |
Y |
|
觸發器名稱 |
| group |
string |
N |
預設組名 |
觸發器名稱 |
| description |
string |
N |
|
觸發器描述 |
| job-name |
string |
Y |
|
要觸發的任務的名稱 |
| job-group |
string |
Y |
|
要觸發的任務的組名稱 |
| durable |
boolean |
N |
false |
任務完成後是否依然儲存到資料庫 |
| recover |
boolean |
N |
false |
應用或服務重啟之後是否忽略到期任務 |
- 觸發器 (trigger 節點)
下面說下最常用的兩種觸發器:
1)簡單觸發器(simple 節點)用於觸發定時輪訓執行的任務。
| simple 節點項說明 |
| 名稱 |
類型 |
是否必填 |
預設值 |
描述 |
| name |
string |
Y |
|
觸發器名稱 |
| group |
string |
N |
預設組名 |
觸發器名稱 |
| description |
string |
N |
|
觸發器描述 |
| job-name |
string |
Y |
|
要觸發的任務的名稱 |
| job-group |
string |
Y |
|
要觸發的任務的組名稱 |
| repeat-count |
int |
Y |
0 |
重複次數(0:不執行;-1:不限次數) |
| repeat-interval |
long |
Y |
0 |
間隔時間(單位:毫秒) |
| start-time |
date |
N |
目前時間 |
開始時間 |
| end-time |
date |
N |
|
結束時間(如果不指定則一直執行直到重複次數) |
2)Cron 觸發器(cron 節點)根據 cron 運算式觸發任務。
| cron 節點項說明 |
| 名稱 |
類型 |
是否必填 |
預設值 |
描述 |
| name |
string |
Y |
|
觸發器名稱 |
| group |
string |
N |
預設組名 |
觸發器名稱 |
| description |
string |
N |
|
觸發器描述 |
| job-name |
string |
Y |
|
要觸發的任務的名稱 |
| job-group |
string |
Y |
|
要觸發的任務的組名稱 |
| cron |
string |
Y |
|
規則運算式 |
| start-time |
date |
N |
目前時間 |
開始時間 |
| end-time |
date |
N |
|
結束時間 |
註:cron 運算式線上產生:http://cron.qqe2.com
3. 日誌設定檔
1) app.config
- configSctions
1 <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" />2 <sectionGroup name="common">3 <section name="logging" type="Common.Logging.ConfigurationSectionHandler, Common.Logging" />4 </sectionGroup>
- commong.logging 配置
1 <common>2 <logging>3 <factoryAdapter type="Common.Logging.Log4Net.Log4NetLoggerFactoryAdapter, Common.Logging.Log4Net1213">4 <arg key="configType" value="FILE-WATCH" />5 <arg key="configFile" value="~/Conf/log4net.config" />6 <arg key="level" value="INFO" />7 </factoryAdapter>8 </logging>9 </common>
- configType : 用於指定日子設定檔類型,取值:INLINE - 在當前設定檔總;FILE-WATCH - 設定檔中。
- configFile:設定檔路徑。
- level:日子輸出層級。
- log4net 配置
log4net.config
主程式碼:
1 using System.ServiceProcess; 2 using Common.Logging; 3 using Quartz; 4 using Quartz.Impl; 5 6 namespace Wlitsoft.ProjectSample.QuartzNETWinService 7 { 8 public partial class MainService : ServiceBase 9 {10 #region 私人屬性11 12 //日誌記錄這。13 private readonly ILog _logger;14 15 //調度器。16 private readonly IScheduler _scheduler;17 18 #endregion19 20 #region 構造方法21 22 /// <summary>23 /// 初始化 <see cref="MainService"/> 類的新執行個體。24 /// </summary>25 public MainService()26 {27 InitializeComponent();28 this._logger = LogManager.GetLogger(this.GetType());29 StdSchedulerFactory factory = new StdSchedulerFactory();30 this._scheduler = factory.GetScheduler();31 }32 33 #endregion34 35 protected override void OnStart(string[] args)36 {37 this._scheduler.Start();38 this._logger.Info("服務啟動");39 }40 41 protected override void OnStop()42 {43 if (!this._scheduler.IsShutdown)44 this._scheduler.Shutdown();45 this._logger.Info("服務停止");46 }47 48 protected override void OnPause()49 {50 this._scheduler.PauseAll();51 base.OnPause();52 }53 54 protected override void OnContinue()55 {56 this._scheduler.ResumeAll();57 base.OnContinue();58 }59 }60 }
樣本任務代碼:
1 using Common.Logging; 2 using Quartz; 3 4 namespace Wlitsoft.ProjectSample.QuartzNETWinService.Job 5 { 6 public class Job1 : IJob 7 { 8 //日誌構造者。 9 private static readonly ILog Logger = LogManager.GetLogger("job1");10 11 #region Implementation of IJob12 13 /// <summary>14 /// Called by the <see cref="T:Quartz.IScheduler" /> when a <see cref="T:Quartz.ITrigger" />15 /// fires that is associated with the <see cref="T:Quartz.IJob" />.16 /// </summary>17 /// <remarks>18 /// The implementation may wish to set a result object on the19 /// JobExecutionContext before this method exits. The result itself20 /// is meaningless to Quartz, but may be informative to21 /// <see cref="T:Quartz.IJobListener" />s or22 /// <see cref="T:Quartz.ITriggerListener" />s that are watching the job‘s23 /// execution.24 /// </remarks>25 /// <param name="context">The execution context.</param>26 public void Execute(IJobExecutionContext context)27 {28 string jobDes = context.JobDetail.Description;29 Logger.Info($"{jobDes}運行");30 }31 32 #endregion33 }34 }
源碼地址:https://github.com/Wlitsoft/QuartzNETWinServiceSample
推薦閱讀:一個技術汪的開源夢
Quartz.NET Windows