在上一篇文章當中,我簡單的介紹了直接在代碼中進行作業和觸發器的建立,Quartz的強大之處在於其的配置文件,所以,這一篇博客主要講怎麼通過配置文件來建立作業和觸發器。
首先我們創建作業調度器和和啓動調度器:
static void Main(string[] args)
{
// 創建作業調度器
ISchedulerFactory chedulerFactory = new StdSchedulerFactory();
IScheduler scheduler = chedulerFactory.GetScheduler();
// 啓動調度器
scheduler.Start();
}
接着創建作業:
public class NewJob : IJob
{
public async Task Execute(IJobExecutionContext context)
{
Console.WriteLine(DateTime.Now);
}
}
接下來就是我們的重頭戲了,我們通過配置文件來進行Quartz的使用,我們需要建立一個quartz_jobs.xml的文件,千萬記得要將該文件的屬性選擇爲始終複製,如下:
<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>
<job>
<!--作業名字,隨便取-->
<name>Job</name>
<!--組名,隨便取-->
<group>group</group>
<!--描述-->
<description>job</description>
<!--作業類,要定位到我們代碼中創建的作業,命名空間.類名-->
<job-type>QuartzTest.NewJob, QuartzTest</job-type>
<durable>true</durable>
<recover>false</recover>
</job>
<trigger>
<!--簡單的觸發器-->
<simple>
<!--觸發器名字,隨便取-->
<name>Trigger</name>
<!--組名-->
<group>group</group>
<!--描述-->
<description>trigger</description>
<!--作業名,觸發哪個作業-->
<job-name>Job</job-name>
<!--作業的組名,與作業對應-->
<job-group>group</job-group>
<misfire-instruction>SmartPolicy</misfire-instruction>
<!--任務執行次數,-1爲無限執行-->
<repeat-count>-1</repeat-count>
<!--每5000毫秒執行一次-->
<repeat-interval>5000</repeat-interval>
</simple>
</trigger>
</schedule>
</job-scheduling-data>
光有這個文件還不行,我們還需要一個配置文件,也就是要讓程序知道我們讀取哪一個配置文件,有兩種配置文件的寫法,第一種是使用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="ServerScheduler" />
<add key="quartz.threadPool.type" value="Quartz.Simpl.SimpleThreadPool, Quartz" />
<add key="quartz.threadPool.threadCount" value="10" />
<add key="quartz.threadPool.threadPriority" value="2" />
<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.jobStore.misfireThreshold" value="60000" />
<add key="quartz.jobStore.type" value="Quartz.Simpl.RAMJobStore, Quartz" />
</quartz>
</configuration>
如果使用的是Quartz.net3.x版本的,記得修改爲:
<add key="quartz.plugin.xml.fileNames" value = "~/quartz_jobs.xml" />
第二種是使用quartz.config,這裏也記得千萬選擇始終複製,當然,會在根節點出現紅色的波浪線,不用管它,完全沒事:
# You can configure your scheduler in either <quartz> configuration section
# or in quartz properties file
# Configuration section has precedence
quartz.scheduler.instanceName = ServerScheduler
# 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
好了,現在就可以進行測試了,測試結果就是每五秒輸出一下當前的事件時間。
我們這裏使用的是簡單的觸發器,那怎麼使用cron表達式的觸發器呢?需要修改配置文件quartz_jobs.xml,代碼如下:
<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>
<job>
<!--作業名字,隨便取-->
<name>Job</name>
<!--組名,隨便取-->
<group>group</group>
<!--描述-->
<description>job</description>
<!--作業類,要定位到我們代碼中創建的作業,命名空間.類名-->
<job-type>QuartzTest.NewJob, QuartzTest</job-type>
<durable>true</durable>
<recover>false</recover>
</job>
<trigger>
<!--cron表達式觸發器-->
<cron>
<!--觸發器名字,隨便取-->
<name>Trigger</name>
<!--組名-->
<group>group</group>
<!--描述-->
<description>trigger</description>
<!--作業名,觸發哪個作業-->
<job-name>Job</job-name>
<!--作業的組名,與作業對應-->
<job-group>group</job-group>
<misfire-instruction>SmartPolicy</misfire-instruction>
<cron-expression>0/5 * * * * ?</cron-expression>
</cron>
</trigger>
</schedule>
</job-scheduling-data>
整個框架從基礎而言,用着十分清爽,且配合cron表達式用着也十分的強大,幾乎能應對各種任務調度。