進來項目中用到了 任務調度 來實現短信發送網關,所以這里分享下Quartz.net 的使用經驗。任務調度選用了 Quartz.net 來實現,之前用的是C#中自帶的window服務安裝,這次也打算用Topshel來做window服務,其實感覺差不多。ok,接下來說下 Quartz.net 在開發中的使用:
Quartz.NET簡介
作業調度的目標在于按照預先確定的時間和指定的順序來確保高效的數據處理流程,從而最大限度的使用系統資源。批處理流程是一種在無需最終用戶干預的方式下在后臺通過順序方式運行的操作。
Quartz.NET是一個開源的作業調度框架,是OpenSymphony 的 Quartz API的.NET移植,它用C#寫成,可用于winform和asp.net應用中。它提供了巨大的靈活性而不犧牲簡單性。你能夠用它來為執行一個作業而創建簡單的或復雜的調度。它有很多特征,如:數據庫支持,集群,插件,支持cron-like表達式等等。
Quartz.NET 是一個開源的作業調度框架,它可以被在小型應用程序甚至是企業級的應用程序。它有如下幾個特點:
Quartz.NET使用
首先引用下面的dll
前4個是Quartz.NET使用所必須的,Toshelf是用來做window服務所用的
添加QuartzHelp類庫
添加JobDemo.cs,實現IJob接口。
1 namespace QuartzHelp 2 { 3 public class JobDemo : IJob 4 { 5 //日志對象 6 PRivate static readonly ILog logger = LogManager.GetLogger(typeof(JobDemo)); 7 8 public void Execute(IJobExecutionContext context) 9 {10 logger.Info("JobDemo開始運作,模擬處理200ms的程序");11 Thread.Sleep(200);12 logger.Info("JobDemo處理完");13 }14 }15 }View Code
添加WindowControl 控制臺
添加Service.cs文件,作為任務調度的入口
1 namespace WindowControl 2 { 3 public class Service 4 { 5 private readonly ILog logger; 6 private IScheduler scheduler; 7 public Service() 8 { 9 logger = LogManager.GetLogger(typeof(Service));10 ISchedulerFactory schedulerFactory = new StdSchedulerFactory();11 scheduler = schedulerFactory.GetScheduler();12 }13 14 public void Start()15 {16 scheduler.Start();17 logger.Info("Quartz服務成功啟動");18 }19 20 public void Stop()21 {22 scheduler.Shutdown(true);23 logger.Info("Quartz服務成功終止");24 }25 26 }27 }View Code
在Program.cs文件中,啟動任務調度
1 namespace WindowControl 2 { 3 class Program 4 { 5 static void Main(string[] args) 6 { 7 HostFactory.Run(x => 8 { 9 x.Service<Service>((s) =>10 {11 s.SetServiceName("ser");12 s.ConstructUsing(name => new Service());13 s.WhenStarted((t) => t.Start());14 s.WhenStopped((t) => t.Stop());15 });16 17 x.RunAsLocalSystem();18 19 //服務的描述20 x.SetDescrView Code添加配置文件
新建一個Configs的文件夾,首先添加quartz_jobs.xml(作為 調度任務 的配置文件)
1 <?xml version="1.0" encoding="UTF-8"?> 2 3 <!-- This file contains job definitions in schema version 2.0 format --> 4 5 <job-scheduling-data xmlns="http://quartznet.sourceforge.net/JobSchedulingData" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.0"> 6 7 <processing-directives> 8 <!-- 在計劃作業和觸發器是應遵循的命令和原則 --> 9 <overwrite-existing-data>true</overwrite-existing-data>10 </processing-directives>11 12 <schedule>13 <job>14 <name>myJob</name>15 <group>myJobGroup</group>16 <description>第一個工作任務</description>17 <job-type>QuartzHelp.JobDemo, QuartzHelp</job-type>18 <durable>true</durable>19 <recover>false</recover>20 </job>21 <trigger>22 <cron>23 <name>Trigger</name>24 <group>TriggerGroup</group>25 <description>Simple trigger to simply fire sample job</description>26 <job-name>myJob</job-name>27 <job-group>myJobGroup</job-group>28 <!--每10秒中執行一次-->29 <cron-expression>0/01 * * * * ?</cron-expression>30 </cron>31 </trigger>32 </schedule>33 </job-scheduling-data>View Codequartz_jobs.xml配置項說明:
1 <?xml version="1.0" encoding="utf-8" ?> 2 <!-- This file contains job definitions in schema version 2.0 format --> 3 4 <!--在2.0版本中根結點由<quartz> 變為了<job-scheduling-data>--> 5 <job-scheduling-data xmlns="http://quartznet.sourceforge.net/JobSchedulingData" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.0"> 6 7 <!--保持默認配置即可,具體作用有待研究--> 8 <processing-directives> 9 <overwrite-existing-data>true</overwrite-existing-data>10 </processing-directives>11 12 <!--任務調度集合-->13 <schedule>14 <!--2.0版本中的job相當于1.x版本中的<job-detail>,這個節點是用來定義每個具體的任務的,多個任務請創建多個job節點即可-->15 <job>16 <!--任務名稱,同一個group中多個job的name不能相同,若未設置group則所有未設置group的job為同一個分組(必須設置)-->17 <name>sampleJob</name>18 <!--任務所屬分組,用于標識任務所屬分組-->19 <group>sampleGroup</group>20 <!--工作任務的描述,用于描述任務具體內容-->21 <description>Sample job for Quartz Server</description>22 <!--任務類型,任務的具體類型及所屬程序集,格式:實現了IJob接口的包含完整命名空間的類名,程序集名稱-->23 <job-type>Quartz.Server.SampleJob, Quartz.Server</job-type>24 <!--<durable>(持久性)-如果一個Job是不持久的, 一旦沒有觸發器與之關聯,它就會被從scheduler 中自動刪除-->25 <durable>true</durable>26 <recover>false</recover>27
新聞熱點
疑難解答