Quartz.NET 項目地址 http://quartznet.sourceforge.net/
Quartz.NET 2.0 學習筆記(1) :Quartz.NET簡介
Quartz.NET 2.0 學習筆記(2) :和1.0的幾點不同
Quartz.NET 2.0 學習筆記(3) :通過配置文件實現任務調度
Quartz.NET 2.0 學習筆記(4) :cron表達式
Quartz.NET 2.0 學習筆記(5) :實例創建Windows服務實現任務調度
Quartz.NET 2.0 可以很方便的通過配置的xml文件方式實現靈活的任務調度配置(1.0版本就已經支持了,只是配置文件格式有些變化)
默認的quartz任務配置文件為quartz_jobs.xml,在quartz服務的根目錄下,可以通過quartz.config中quartz.plugin.xml.fileNames = ~/quartz_jobs.xml進行設置
默認quartz.config文件結構如下

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 = ServerScheduler 6 7 # configure thread pool info 8 quartz.threadPool.type = Quartz.Simpl.SimpleThreadPool, Quartz 9 quartz.threadPool.threadCount = 10 10 quartz.threadPool.threadPriority = Normal 11 12 # job initialization plugin handles our xml reading, without it defaults are used 13 quartz.plugin.xml.type = Quartz.Plugin.Xml.XMLSchedulingDataProcessorPlugin, Quartz 14 quartz.plugin.xml.fileNames = ~/quartz_jobs.xml 15 16 # export this server to remoting context 17 quartz.scheduler.exporter.type = Quartz.Simpl.RemotingSchedulerExporter, Quartz 18 quartz.scheduler.exporter.port = 555 19 quartz.scheduler.exporter.bindName = QuartzScheduler 20 quartz.scheduler.exporter.channelType = tcp 21 quartz.scheduler.exporter.channelName = httpQuartz
首先看一下簡單的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 <overwrite-existing-data>true</overwrite-existing-data> 9 </processing-directives> 10 11 <schedule> 12 13 <job> 14 <name>sampleJob</name> 15 <group>sampleGroup</group> 16 <description>Sample job for Quartz Server</description> 17 <job-type>Quartz.Server.SampleJob, Quartz.Server</job-type> 18 <durable>true</durable> 19 <recover>false</recover> 20 </job> 21 <trigger> 22 <simple> 23 <name>sampleSimpleTrigger</name> 24 <group>sampleSimpleGroup</group> 25 <description>Simple trigger to simply fire sample job</description> 26 <job-name>sampleJob</job-name> 27 <job-group>sampleGroup</job-group> 28 <misfire-instruction>SmartPolicy</misfire-instruction> 29 <repeat-count>-1</repeat-count> 30 <repeat-interval>10000</repeat-interval> 31 </simple> 32 </trigger> 33 34 <job> 35 <name>CommissionJob</name> 36 <group>CommissionJob</group> 37 <description>Sample job for Quartz Server</description> 38 <job-type>Settlement.Jobs.CommissionJob, Settlement.Jobs</job-type> 39 <durable>true</durable> 40 <recover>false</recover> 41 </job> 42 <trigger> 43 <cron> 44 <name>sampleSimpleTrigger2</name> 45 <group>sampleSimpleTrigger2</group> 46 <job-name>sampleJob2</job-name> 47 <job-group>sampleGroup2</job-group> 48 <cron-expression>0/10 * * * * ?</cron-expression> 49 </cron> 50 </trigger> 51 </schedule> 52 </job-scheduling-data>
job-scheduling-data 為跟節點不再解釋
processing-directives這個節點官方給的示例中就存在,干啥用的沒有深入了解,保持默認配置即可
schedule任務調度集合可以配置多個但貌似只有第一個的配置起作用,如何讓多個schedule同時起作用希望知道的童鞋告訴下,不勝感激。所有的job和trigger均放在這個節點下面
job 任務,其實就是1.x版本中的<job-detail>,這個節點是用來定義每個具體的任務的,多個任務請創建多個job節點即可
- name(必填) 任務名稱,同一個group中多個job的name不能相同,若未設置group則所有未設置group的job為同一個分組,如:<name>sampleJob</name>
- group(選填) 任務所屬分組,用於標識任務所屬分組,如:<group>sampleGroup</group>
- description(選填) 任務描述,用於描述任務具體內容,如:<description>Sample job for Quartz Server</description>
- job-type(必填) 任務類型,任務的具體類型及所屬程序集,格式:實現了IJob接口的包含完整命名空間的類名,程序集名稱,如:<job-type>Quartz.Server.SampleJob, Quartz.Server</job-type>
- durable(選填) 具體作用不知,官方示例中默認為true,如:<durable>true</durable>
- recover(選填) 具體作用不知,官方示例中默認為false,如:<recover>false</recover>
trigger 任務觸發器,用於定義使用何種方式出發任務(job),同一個job可以定義多個trigger ,多個trigger 各自獨立的執行調度,每個trigger 中必須且只能定義一種觸發器類型(calendar-interval、simple、cron)
calendar-interval 一種觸發器類型,使用較少,此處略過
simple 簡單任務的觸發器,可以調度用於重復執行的任務
- name(必填) 觸發器名稱,同一個分組中的名稱必須不同
- group(選填) 觸發器組
- description(選填) 觸發器描述
- job-name(必填) 要調度的任務名稱,該job-name必須和對應job節點中的name完全相同
- job-group(選填) 調度任務(job)所屬分組,該值必須和job中的group完全相同
- start-time(選填) 任務開始執行時間utc時間,北京時間需要+08:00,如:<start-time>2012-04-01T08:00:00+08:00</start-time>表示北京時間2012年4月1日上午8:00開始執行,注意服務啟動或重啟時都會檢測此屬性,若沒有設置此屬性或者start-time設置的時間比當前時間較早,則服務啟動后會立即執行一次調度,若設置的時間比當前時間晚,服務會等到設置時間相同后才會第一次執行任務,一般若無特殊需要請不要設置此屬性
- repeat-count(必填) 任務執行次數,如:<repeat-count>-1</repeat-count>表示無限次執行,<repeat-count>10</repeat-count>表示執行10次
- repeat-interval(必填) 任務觸發間隔(毫秒),如:<repeat-interval>10000</repeat-interval> 每10秒執行一次
cron復雜任務觸發器--使用cron表達式定制任務調度(強烈推薦)
- name(必填) 觸發器名稱,同一個分組中的名稱必須不同
- group(選填) 觸發器組
- description(選填) 觸發器描述
- job-name(必填) 要調度的任務名稱,該job-name必須和對應job節點中的name完全相同
- job-group(選填) 調度任務(job)所屬分組,該值必須和job中的group完全相同
- start-time(選填) 任務開始執行時間utc時間,北京時間需要+08:00,如:<start-time>2012-04-01T08:00:00+08:00</start-time>表示北京時間2012年4月1日上午8:00開始執行,注意服務啟動或重啟時都會檢測此屬性,若沒有設置此屬性,服務會根據cron-expression的設置執行任務調度;若start-time設置的時間比當前時間較早,則服務啟動后會忽略掉cron-expression設置,立即執行一次調度,之后再根據cron-expression執行任務調度;若設置的時間比當前時間晚,則服務會在到達設置時間相同后才會應用cron-expression,根據規則執行任務調度,一般若無特殊需要請不要設置此屬性
- cron-expression(必填) cron表達式,如:<cron-expression>0/10 * * * * ?</cron-expression>每10秒執行一次
了解了Quartz.NET 2.0的quartz_jobs.xml配置后就可以在項目中引用Quartz.dll文件然后實現IJob接口,根據實際項目中的需要靈活配置quartz_jobs,不需要再進行額外的開發,實現靈活的多任務調度,需要注意的是修改了quartz_jobs.xml文件后,quartz服務默認不會重新加載該文件,若要讓修改后的文件生效需要重啟下服務才行,另外start-time屬性請一定慎用,若實在需要可以在使用完成后立即刪除掉該屬性否則可能造成很嚴重的后果(親身經歷血的教訓,呵呵)
介紹的比較膚淺,本身也沒有過深入的研究,只是根據日常使用經驗自己摸索出來的,整理了一下應付日常簡單應用足以
下一篇介紹下如何使用Quartz創建自己的Windows服務,以及實例實現IJob接口及根據quartz_jobs.xml實現任務調度
PS:
官網(http://quartznet.sourceforge.net/)下載的代碼服使用Topshelf創建的,支持跨平台創建服務
使用方法:控制台下,安裝服務 Quartz.Server.exe install 卸載服務 Quartz.Server.exe uninstall
功能很強大,使用起來很方便,當然了肯定不支持使用sc命令創建服務了,但很多時候我們並不需要靈活和強大的東西,簡簡單單,夠用就中,對於我來說用普通的windows服務足以