1.博客園: http://www.cnblogs.com/lzrabbit/archive/2012/04/13/2447609.htmlhtml
2.官網:http://www.cnblogs.com/lzrabbit/archive/2012/04/13/2447609.htmlgit
本文主要是記錄實施的過程及要點,具體的內容請參考上面的兩個地址,寫的很是細緻。github
實現IJob接口,實現void Execute(IJobExecutionContext context)便可,這裏可能須要注意的應該是日誌。Quart.NET集成了Common.Logging,我在運用時,使用了它的Log4Net擴展。web
install-package Quartzexpress
install-package Common.Logging.Log4Net1211windows
這裏稍微有點坑,Common.Logging.Log4Net有多個版本,每一個版本對應的log4net版本是不一致的,而且在App.config(Web.config)中有強制版本的聲明,若運行報錯必定是沒有配置好。我採用Log4Net1211配置以下app
1 <configuration> 2 <configSections> 3 <sectionGroup name="common"> 4 <section name="logging" type="Common.Logging.ConfigurationSectionHandler, Common.Logging" /> 5 </sectionGroup> 6 </configSections> 7 8 <common> 9 <logging> 10 <factoryAdapter type="Common.Logging.Log4Net.Log4NetLoggerFactoryAdapter, Common.Logging.Log4net1211"><!--注意此處的名稱要和引用的Nuget包一致,第一次我這邊不是1211一直報錯,google無數還沒解決方案--> 11 ... 12 </factoryAdapter> 13 </logging> 14 </common> 15 16 <runtime> 17 <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> 18 <dependentAssembly> 19 <assemblyIdentity name="log4net" publicKeyToken="669e0ddf0bb1aa2a" culture="neutral" /> 20 <bindingRedirect oldVersion="0.0.0.0-1.2.11.0" newVersion="1.2.11.0" /> 21 </dependentAssembly><!--此處版本也須要一致--> 22 </assemblyBinding> 23 </runtime> 24 </configuration>
詳見Demo CapQueen.Scheduler.HelloJob 關鍵點的是配置Job的Tragger。 全部的Job配置在CapQueen.Scheduler.Service/quartz_jobs.xml中,下面的配置說明摘自參考1框架
<schedule> <!--2.0版本中的job至關於1.x版本中的<job-detail>,這個節點是用來定義每一個具體的任務的,多個任務請建立多個job節點便可--> <job> <!--任務名稱,同一個group中多個job的name不能相同,若未設置group則全部未設置group的job爲同一個分組(必須設置)--> <name>sampleJob</name> <!--任務所屬分組,用於標識任務所屬分組--> <group>sampleGroup</group> <!--工做任務的描述,用於描述任務具體內容--> <description>Sample job for Quartz Server</description> <!--任務類型,任務的具體類型及所屬程序集,格式:實現了IJob接口的包含完整命名空間的類名,程序集名稱--> <job-type>Quartz.Server.SampleJob, Quartz.Server</job-type> <!--<durable>(持久性)-若是一個Job是不持久的, 一旦沒有觸發器與之關聯,它就會被從scheduler 中自動刪除--> <durable>true</durable> <recover>false</recover> </job> <!--trigger 任務觸發器,用於定義使用何種方式觸發任務(job),同一個job能夠定義多個trigger ,多個trigger 各自獨立的執行調度,每一個trigger 中必須且只能定義一種觸發器類型(calendar-interval、simple、cron) calendar-interval 一種觸發器類型,使用較少,此處略過--> <trigger> <!--簡單任務的觸發器,能夠調度用於重複執行的任務--> <simple> <!--觸發器名稱,同一個分組中的名稱必須不一樣--> <name>sampleSimpleTrigger</name> <!--觸發器組--> <group>sampleSimpleGroup</group> <!--觸發器描述--> <description>Simple trigger to simply fire sample job</description> <!--要調度的任務名稱,該job-name必須和對應job節點中的name徹底相同--> <job-name>sampleJob</job-name> <!--調度任務(job)所屬分組,該值必須和job中的group徹底相同--> <job-group>sampleGroup</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設置的時間比當前時間較早,則服務啓動後會當即執行一次調度,若設置的時間比當前時間晚,服務會等到設置時間相同後纔會第一次執行任務,通常若無特殊須要請不要設置此屬性--> <misfire-instruction>SmartPolicy</misfire-instruction> <!--任務執行次數,如:<repeat-count>-1</repeat-count>表示無限次執行--> <repeat-count>-1</repeat-count> <!--任務觸發間隔(毫秒)--> <repeat-interval>10000</repeat-interval> </simple> </trigger> <trigger> <!--cron複雜任務觸發器使用cron表達式定製任務調度--> <cron> <name>sampleSimpleTrigger2</name> <group>sampleSimpleTrigger2</group> <job-name>sampleJob2</job-name> <job-group>sampleGroup2</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表達式--> <cron-expression>0/10 * * * * ?</cron-expression> </cron> </trigger>
其中trigger的觸發時間配置,推薦採用cron-expression,這是源自Linux的配置,十分強大,建議學習。詳細參考:懶惰的肥兔的總結tcp
Quart.NET的Host很方便,支持web/console/windows service。 官方的示例中採用了Topshelf框架進行Windows Service/Console方式的部署。詳細查看官方示例Demo。也能夠查看個人Demo。ide
關於TopShelf很是值得提一提,相見恨晚啊,這麼好的框架,我卻沒有早點發現。
TopShelf 擴展了console/Windows Service,使console直接具有exe host和service host兩種能力。
exe Host: CMD中直接運行exe
Service Host: xxx.exe /install[uninstall]
今後調試Windows Service告別了附加調試,直接F5便可調試。
Quart 的Web Host:demo 中沒有實現,只要在global中appstart/end事件中啓動scheduler.Start()/scheduler.Shutdown(true);
關於Quart的管理工具仍是挺多的,我選擇了社區比較活躍的CrystalQuartz
安裝十分簡單,在任何的Web工程中直接NuGet: CrystalQuartz.Remote
它是基於Quartz公開的TCP API進行調度管理的,所以必定要給Quartz配置好remote服務。配置很簡單,具體參見Demo app.config quartz / remoting expoter 的配置
安裝完成以後,默認會配置好Web.config,而且默認的 Quartz tcp端口是555,訪問:localhost:/CrystalQuartzPanel.axd便可查看管理控制檯
Mark到此結束,Demo請看:GitHub, 但願本文略微有點參考價值。