开发环境
.net 4.5.1
quartz.dll v2.4.1.0 依赖下面的dll
Common.Loggin.dll v3.3.1.0 依赖下面的dll
Common.Loggin.Core.dll v3.3.1.0
本次教程只介绍基于quartz_jobs.xml配置文件方式的开发,这也是简单且常见的方式
Quartz核心概念
1、Job 表示一个工作任务,业务代码的执行入口,业务代码需要继承Quartz.IJob接口并实现Execute方法,此方法即业务代码的入口函数
2、JobDetail 表示一个上体的可执行的调度程序
3、Trigger 代表一个调度参数的配置,调度方案与执行计划
4、Scheduler 代表一个调度容器,可以注册多个JobDetail和Trigger
5、SchedulerPlugin 调度插件,自定义插件需要继承 Quartz.Spi.ISchedulerPlugin
6、SchedulerListener 调度监听器,自定义需要继承 Quartz.ISchedulerListener
7、TriggerListener 触发器监听器,自定义需要继承 Quartz.ITriggerListener
8、JobListener 工作任务监听器,自定义需要继承 Quartz.IJobListener
业务开发介绍
这一块的基础实现其实很简单,只需要继承Quartz.IJob类,并实际Execute方法,此方法是业务代码执行的入口,将业务代码写好,并配置好quartz_jobs.xml文件即可运行
示例:
1、新建一个类库项目,并引入Quartz.dll
using System;
using Quartz;
namespace QuartzTestJob
{
public class TestJob : Quartz.IJob
{
public void Execute(IJobExecutionContext context)
{
Console.WriteLine("执行业务代码");
Console.WriteLine("这是单独DLL文件的业务代码-v1.0.2");
}
}
}
2、编译上面的代码并生成dll文件,即完成了最简单的业务代码部分
3、配置工作任务与触发器 quartz_jobs.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<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>TestJob2Job</name>
<group>TestJob2JobGroup</group>
<description>测试JOB</description>
<job-type>QuartzTestJob.TestJob,QuartzTestJob</job-type>
<durable>true</durable>
<recover>false</recover>
</job>
<trigger>
<cron>
<name>TestJob2Trigger</name>
<group>TestJob2TriggerGroup</group>
<job-name>TestJob2Job</job-name>
<job-group>TestJob2JobGroup</job-group>
<start-time>2015-01-01T00:00:00+08:00</start-time>
<cron-expression>0 */1 * * * ? </cron-expression>
</cron>
</trigger>
</schedule>
</job-scheduling-data>
配置介绍:
一个Job块对应一个Trigger块,不然不会工作,具体工作原理可通过反编译Quartz.dll文件,看看Quartz.Plugin.Xml.XMLSchedulingDataProcessorPlugin 这个类的代码,他是怎么解析这个配置文件的,我没去研究。
JOB 块
name: job的名称,必须全局唯一
group:job的分组,quartz有按组暂停job的能力,非必填,Quartz会自动生成,下面的相关的也类型
job-type: 这个是业务dll的Type,基于C#的反射功能完成,分为两段,第一段是完整的类型名,包含:命令空间,类名,第二段我的理解应该是dll文件名称,刚开始研究的时候就犯过这个错误,dll文件名和命令空间名称不一致,导致代码一直不执行,又不报错,完全不知道原因。trigger 块
调度类型,共有四种类型,常用的是cron和simple这两种,
cron 类似于Linux的计划任务那种 0 0/2 * * * ?
simple 可以设置执行次数和执行间隔,两种的配置格式以示例一样,cron块
name: 触发器名称,必须唯一
group:分组,非必填
job-name: 关联的job名称
job-group:关联的job分组,非必填
start-time: 开始日期与时间
cron-expression: 调度计划,可以参考https://www.w3cschool.cn/quartz_doc/quartz_doc-lwuv2d2a.htmlsimple块
name: 触发器名称,必须唯一
group:分组,非必填
job-name: 关联的job名称
job-group:关联的job分组,非必填
repeat-count:执行次数,-1 代表永不停止
repeat-interval:执行间隔,单位毫秒
4、新建一个控制台项目,并引入Quartz.dll,在main方法中初始化Scheduler并启动即可运行代码了
using Quartz;
using Quartz.Impl;
namespace QuartzTest
{
class Program
{
static void Main(string[] args)
{
Quartz.IScheduler scheduler = Quartz.Impl.StdSchedulerFactory.GetDefaultScheduler();
scheduler.Start();
}
}
5、quartz.conf 文件介绍
这是quartz的配置文件,介绍几个常见的参数,一般下载回来的包里面都已经有默认设置了,无需修改
#调度容器的实例名称,很少使用
quartz.scheduler.instanceName = QuartzTest
#调度容器内的工作线程引用的类型
quartz.threadPool.type = Quartz.Simpl.SimpleThreadPool, Quartz
#工作线程数量,可根据自己的任务数量调大,以防任务数量太多,有些任务无线程可用
quartz.threadPool.threadCount = 10
#优先级设置,默认吧。不知道怎么配置
quartz.threadPool.threadPriority = Normal
#这是官方自带的插件,用来解析我们在quartz_jobs.xml中配置的任务与触发器,
quartz.plugin.xml.type = Quartz.Plugin.Xml.XMLSchedulingDataProcessorPlugin, Quartz
#配置文件的名称
quartz.plugin.xml.fileNames = ~/quartz_jobs.xml
引用参考
https://www.w3cschool.cn/quartz_doc/
http://www.quartz-scheduler.org/ 这个在国内打开可能很慢