開發環境
.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/ 這個在國內打開可能很慢