在上一篇文章当中,我简单的介绍了直接在代码中进行作业和触发器的建立,Quartz的强大之处在于其的配置文件,所以,这一篇博客主要讲怎么通过配置文件来建立作业和触发器。
首先我们创建作业调度器和和启动调度器:
static void Main(string[] args)
{
// 创建作业调度器
ISchedulerFactory chedulerFactory = new StdSchedulerFactory();
IScheduler scheduler = chedulerFactory.GetScheduler();
// 启动调度器
scheduler.Start();
}
接着创建作业:
public class NewJob : IJob
{
public void 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版本的,得再单独引入Quartz.Plugin插件,然后记得修改为:
<add key="quartz.plugin.xml.type" value = "Quartz.Plugin.Xml.XMLSchedulingDataProcessorPlugin, Quartz.Plugin" />
<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表达式用着也十分的强大,几乎能应对各种任务调度。