轉載自:http://www.cnblogs.com/zhangweizhong/p/4874396.htmlhtml
前段時間,花了大量的時間,將原先的計劃任務,切換到Quartz.NET來進行管理。原先的後臺定時服務都是經過計劃任務來實現的,可是隨着業務增加,計劃任務也愈來愈多,每一個後臺服務,都得建立一個計劃任務。平常的維護和管理很是麻煩。數據庫
因而乎,一咬牙,決定引入Quartz.NET框架,統一都管理所有的後臺定時服務。切換過程確實很麻煩。直到今天,才終於有時間整理總結Quartz.NET的相關內容。express
Quartz.NET的優勢和使用場景,這裏再也不多說,網上有不少說明,總的來講就是,Quartz.NET是一個開源的做業調度框架,很是適合在平時的工做中,定時輪詢數據庫同步,定時郵件通知,定時處理數據等。 Quartz.NET容許開發人員根據時間間隔(或天)來調度做業。它實現了做業和觸發器的多對多關係,還能把多個做業與不一樣的觸發器關聯,配置靈活方便。windows
參考官方學習文檔:http://www.quartz-scheduler.net/documentation/index.html框架
快速搭建一個Quartz,源代碼下載tcp
第一步:新建解決方案和相關項目,並安裝相關程序包,以下圖所示:工具
Quartz依賴Common.Logging和Common.Logging.Log4Net,並且Log4Net也是比較熟悉的日誌工具,所以咱們實際使用中,也是log4net記錄日誌,另外定時做業通常都是在window服務中,咱們也可用Topshelf來建立咱們的window服務。學習
第二步:建立兩個Job類Job1,Job2。實現IJob,在Execute方法裏編寫要處理的業務邏輯,系統就會按照Quartz的配置,定時處理。this
using System; using System.Threading; namespace Quartz.Net.Jobs { /// <summary> /// 實現IJob接口 /// </summary> public class Job1 : IJob { private static readonly Common.Logging.ILog logger = Common.Logging.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); public void Execute(IJobExecutionContext context) { try { logger.Info("Job1 任務運行開始"); for (int i = 0; i < 5; i++) { Thread.Sleep(100); logger.InfoFormat("Job1 正在運行{0}", i); } logger.Info("Job1任務運行結束"); } catch (Exception ex) { logger.Error("Job1 運行異常", ex); } } } }
第三步:配置quartz.config、quartz_jobs.xmlspa
Quartz 實例的基礎配置:quartz.config
# You can configure your scheduler in either <quartz> configuration section # or in quartz properties file # Configuration section has precedence quartz.scheduler.instanceName = QuartzTest # configure thread pool info quartz.threadPool.type = Quartz.Simpl.SimpleThreadPool, Quartz quartz.threadPool.threadCount = 10 quartz.threadPool.threadPriority = Normal # job initialization plugin handles our xml reading, without it defaults are used quartz.plugin.xml.type = Quartz.Plugin.Xml.XMLSchedulingDataProcessorPlugin, Quartz quartz.plugin.xml.fileNames = ~/quartz_jobs.xml # export this server to remoting context #quartz.scheduler.exporter.type = Quartz.Simpl.RemotingSchedulerExporter, Quartz #quartz.scheduler.exporter.port = 555 #quartz.scheduler.exporter.bindName = QuartzScheduler #quartz.scheduler.exporter.channelType = tcp #quartz.scheduler.exporter.channelName = httpQuartz
各個Job 任務的配置 :quartz_jobs.xml
<?xml version="1.0" encoding="UTF-8"?> <!-- This file contains job definitions in schema version 2.0 format --> <job-scheduling-data xmlns="http://quartznet.sourceforge.net/JobSchedulingData" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.0"> <processing-directives> <overwrite-existing-data>true</overwrite-existing-data> </processing-directives> <schedule> <!--定義Job1 Job--> <job> <name>Job1</name> <group>JobGroup</group> <description>Quartz Job1</description> <job-type>Quartz.Net.Jobs.Job1,Quartz.Net.Jobs</job-type> <durable>true</durable> <recover>false</recover> </job> <!--定義Job2 Job--> <job> <name>Job2</name> <group>JobGroup</group> <description>Quartz Job2</description> <job-type>Quartz.Net.Jobs.Job2,Quartz.Net.Jobs</job-type> <durable>true</durable> <recover>false</recover> </job> <!--定義Job1 觸發器 每30秒執行一次Job1任務--> <trigger> <cron> <name>Job1Trigger</name> <group>JobTriggerGroup</group> <job-name>Job1</job-name> <job-group>JobGroup</job-group> <cron-expression>0/30 * * * * ?</cron-expression> </cron> </trigger> <!--定義Job2 觸發器 每分鐘執行一次Job2任務--> <trigger> <cron> <name>Job2Trigger1</name> <group>JobTriggerGroup</group> <job-name>Job2</job-name> <job-group>JobGroup</job-group> <cron-expression>0 * * * * ?</cron-expression> </cron> </trigger> </schedule> </job-scheduling-data>
第四步:宿主程序,能夠是window服務,也能夠是後臺Console程序,如何用Topshelf來建立咱們的window服務,請看另一篇文章《使用Topshelf 開發windows服務》。
namespace Quartz.Net.Console { class Program { private static IScheduler scheduler; static void Main(string[] args) { ISchedulerFactory schedulerFactory = new StdSchedulerFactory(); scheduler = schedulerFactory.GetScheduler(); scheduler.Start(); } } }
注意:quartz_jobs.xml和quartz.config這兩個文件,要手動複製到輸出目錄下,或者在vs中,分別選中這兩個文件→右鍵屬性→複製到輸入目錄設爲:始終複製。
不然讀取不到這兩個配置文件,程序沒法運行。
運行後,效果以下圖: