Quartz.Net 配置(轉(zhuǎn)載)
Quartz.Net 有兩類配置文件,
1. Quartz.系統(tǒng)級別配置, 默認(rèn)配置文件名為 quartz.config , 是java properties 格式的配置文件, 用來設(shè)定 quartz 整體行為, 比如 scheduler instance id, 線程池大小, jobstore類型, DB jobstore的數(shù)據(jù)庫地址, quartz 的插件(比如有長時間作業(yè)自動 interrupt 插件), 以及定義 job/trigger的配置文件路徑
2. job/trigger的配置文件, 默認(rèn)名稱為 quartz_jobs.xml, 用來配置 job 和 trigger 定義信息
對于Quartz.系統(tǒng)級的配置, 可以直接用代碼設(shè)置, 可以放到quartz.config, 也可以 Quartz.Net 也支持定義在 C#項目的 app.config 文件中, 這樣就不需要單獨再引入 quartz.config 文件.
下面是寫代碼的方式設(shè)定Quartz.系統(tǒng)級配置的示例:
var factory = new StdSchedulerFactory(new System.Collections.Specialized.NameValueCollection() { {"quartz.plugin.xml.fileNames","~/quartz_jobs.xml" }, {"quartz.plugin.xml.type","Quartz.Plugin.Xml.XMLSchedulingDataProcessorPlugin,Quartz"}, {"quartz.plugin.triggHistory.type","Quartz.Plugin.History.LoggingJobHistoryPlugin,Quartz"}, }); IScheduler scheduler = factory.GetScheduler(); scheduler.Start();
定義在 C#項目 app.config 的示例:
<quartz> <add key="quartz.scheduler.instanceName" value="QuartzScheduler" /> <!-- Configure Thread Pool --> <add key="quartz.threadPool.type" value="Quartz.Simpl.SimpleThreadPool, Quartz" /> <add key="quartz.threadPool.threadCount" value="10" /> <add key="quartz.threadPool.threadPriority" value="Normal" /> <!-- Configure Job Store --> <add key="quartz.jobStore.type" value="Quartz.Simpl.RAMJobStore, Quartz" /> <add key="quartz.plugin.xml.type" value="Quartz.Plugin.Xml.XMLSchedulingDataProcessorPlugin, Quartz" /> <add key="quartz.plugin.xml.fileNames" value="~/quartz_jobs.xml" /> <add key="quartz.plugin.xml.scanInterval" value="10" /> <add key="quartz.plugin.xml.failOnFileNotFound" value="true" /> </quartz>
注意:
1. V2 版本的插件 quartz.plugin.xml 和 V3 版的quartz.plugin.jobInitializer 是一個東西, v2 插件放在主包中, v3 分離到 Quartz.Plugins 包中了.
2. quartz.plugin.xml.scanInterval 參數(shù)可以設(shè)置定時幾秒自動加載job/trigger定義文件, 取值為0表示禁止自動加載job文件.
3. xml 文件定義的job 只需要調(diào)用 scheduler.Start() 即可自動調(diào)度 ; 但使用代碼build 的job, 需要額外調(diào)用 scheduler.ScheduleJob() 方法才能被調(diào)度.
4. quartz.net Version 3之后開始支持異步, 我使用的是quart 2.6.2, 即v2的最后一個版本, 還是傳統(tǒng)的代碼寫法.
5. 如果沒有空余線程, job將會等到騰出空余線程才會執(zhí)行, 但是等待時間如果超過 misfireThreshold 設(shè)置時間將放棄本次執(zhí)行.
具體可以參考
https://stackoverflow.com/questions/10952240/quartz-net-job-type-configuration-issues
https://github.com/castleproject/Windsor.Quartz/blob/master/docs/configuration.md
https://jalena.bcsytv.com/archives/1994
http://www.rzrgm.cn/skychen1218/p/7765823.html
下面部分轉(zhuǎn)載自 https://jalena.bcsytv.com/archives/1994
Quartz.NET 3.x 例子
最近寫項目需要用到定時任務(wù),所以就找到了Quartz.NET,但網(wǎng)上的例子都是到處抄襲的,完全沒有適合Quartz.NET 3.x 的有用信息,這里就將自己的使用例子帖一下。
- IDE:VS2017
- .Net : 4.5.2
寫在前面
Quartz.NET 在3.x已經(jīng)將插件分離了,所以如果要從xml直接加載文件,需要引入插件包
配置
app.config
<?xml version="1.0" encoding="utf-8"?> <configuration> <configSections> <section name="quartz" type="System.Configuration.NameValueSectionHandler, System, Version=1.0.5000.0,Culture=neutral, PublicKeyToken=b77a5c561934e089" /> </configSections> <quartz> <add key="quartz.scheduler.instanceName" value="QuartzScheduler"/> <add key="quartz.threadPool.type" value="Quartz.Simpl.SimpleThreadPool, Quartz"/> <add key="quartz.threadPool.threadCount" value="10"/> <!--******************************Plugin配置*********************************************--> <add key="quartz.plugin.jobInitializer.type" value="Quartz.Plugin.Xml.XMLSchedulingDataProcessorPlugin, Quartz.Plugins"/> <add key="quartz.plugin.jobInitializer.fileNames" value="quartz_jobs.xml"/> </quartz> <startup> <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.2"/> </startup> </configuration>
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> <!--開始執(zhí)行一個調(diào)度--> <job> <name>jldwjob</name> <group>kelun</group> <description>計量單位</description> <job-type>Kelun.JldwJob, Kelun</job-type><!--格式:實現(xiàn)了IJob接口的包含完整命名空間的類名,程序集名稱--> <durable>true</durable> <recover>false</recover> </job> <trigger> <cron> <name>jlwd</name> <group>kelun</group> <job-name>jldwjob</job-name> <job-group>kelun</job-group> <!--<start-time>2018-01-22T00:00:00+08:00</start-time>--> <cron-expression>0/1 * * * * ?</cron-expression><!--每3秒執(zhí)行一次--> </cron> </trigger> </schedule> </job-scheduling-data>
接口實現(xiàn)
using Kelun.Log4Net; using Quartz; using System.Reflection; using System.Threading.Tasks; namespace Kelun { class JldwJob : IJob { private static readonly IMyLog Logger = MyLogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); public Task Execute(IJobExecutionContext context) { return Task.Run(() => { Logger.Info("定時任務(wù)執(zhí)行"); }); } } }
啟動Quartz
public MainForm() { InitializeComponent(); RunProgramAsync().GetAwaiter().GetResult(); } private static async Task RunProgramAsync() { try { StdSchedulerFactory factory = new StdSchedulerFactory(); IScheduler scheduler = await factory.GetScheduler(); //開啟調(diào)度器 await scheduler.Start(); //創(chuàng)建一個作業(yè) //IJobDetail job = JobBuilder.Create<JldwJob>().WithIdentity("myJob", "group1").Build(); //ITrigger trigger = TriggerBuilder.Create() // .WithIdentity("myTrigger", "group1") // .StartNow() //現(xiàn)在開始 // .WithSimpleSchedule(x => x // .WithIntervalInSeconds(1) //觸發(fā)時間,1秒一次 // .RepeatForever()) // .Build(); //把作業(yè),觸發(fā)器加入調(diào)度器。 //await scheduler.ScheduleJob(job, trigger); //await scheduler.Shutdown(); } catch (SchedulerException se) { Logger.Error("執(zhí)行錯誤", se); } }
禁用Quartz.NET日志輸出
<logger name="Quartz"> <level value="OFF" /> </logger>

浙公網(wǎng)安備 33010602011771號