开发环境
.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核心概念
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
插件开发
常见开发插件有三种类型
1、SchedulerPlugin
2、SchedulerListener
3、TriggerListener
4、JobListener
一、SchedulerPlugin
using Quartz;
using Quartz.Spi;
namespace QuartzTest
{
class SchedulerPluginer : ISchedulerPlugin
{
public string Name => "myPluginer";
//缓存Scheduler对象引用
private static IScheduler _sched;
public void Initialize(string pluginName, IScheduler sched)
{
_sched = sched;
}
public void Shutdown()
{
//默认我们借助VS的自动实现代码,这里是一个抛出异常的语句,一定要处理掉,不然在程序结束的时候,会报异常的,
Console.WriteLine("插件停止");
}
public void Start()
{
//这个插件的功能启动放在这里
//比如注册Listener,下面介绍三种监听器的功能与基础开发,监听器只能监听,没啥控制能力
//也可以做一些控制Job和Trigger的功能
Console.WriteLine("插件开始");
}
}
以上代码就完成了一个插件的开发。但啥用处都没有
二、SchedulerListener
using Quartz;
namespace QuartzTest
{
class SchedulerListener : Quartz.ISchedulerListener
{
public void JobAdded(IJobDetail jobDetail)
{
//Job创建时调用
Console.WriteLine("JobAdded");
}
public void JobDeleted(JobKey jobKey)
{
//Job删除时调用
Console.WriteLine("JobDeleted");
}
public void JobPaused(JobKey jobKey)
{
//Job暂停时调用
Console.WriteLine("JobPaused");
}
public void JobResumed(JobKey jobKey)
{
//Job恢复时调用
Console.WriteLine("JobResumed");
}
public void JobScheduled(ITrigger trigger)
{
//Job关联触发器时调用
Console.WriteLine("JobScheduled");
}
public void JobsPaused(string jobGroup)
{
//Job按分组暂停时调用
Console.WriteLine("JobsPaused");
}
public void JobsResumed(string jobGroup)
{
//Job按分组恢复时调用
Console.WriteLine("JobsResumed");
}
public void JobUnscheduled(TriggerKey triggerKey)
{
//Job删除触发器时调用,在删除Job是也会调用
Console.WriteLine("JobUnscheduled");
}
public void SchedulerError(string msg, SchedulerException cause)
{
//出错
Console.WriteLine("SchedulerError");
}
public void SchedulerInStandbyMode()
{
//不知道
Console.WriteLine("SchedulerInStandbyMode");
}
public void SchedulerShutdown()
{
//调度容器停止时
Console.WriteLine("SchedulerShutdown");
}
public void SchedulerShuttingdown()
{
//不知道
Console.WriteLine("SchedulerShuttingdown");
}
public void SchedulerStarted()
{
//调度容器启动完成
Console.WriteLine("SchedulerStarted");
}
public void SchedulerStarting()
{
//调度窗口启动
Console.WriteLine("SchedulerStarting");
}
public void SchedulingDataCleared()
{
//不知道
Console.WriteLine("SchedulingDataCleared");
}
public void TriggerFinalized(ITrigger trigger)
{
//触发器完成时,比如simple类型的触发器,在完成执行的次数后,就会调用此方法
//可以理解成一个触发器的生命周期结束了,并从调度容器中删除注册
Console.WriteLine("TriggerFinalized");
}
public void TriggerPaused(TriggerKey triggerKey)
{
//触发器暂停时
Console.WriteLine("TriggerPaused");
}
public void TriggerResumed(TriggerKey triggerKey)
{
//触发器恢复时
Console.WriteLine("TriggerResumed");
}
public void TriggersPaused(string triggerGroup)
{
//触发器按分组暂停
Console.WriteLine("TriggersPaused");
}
public void TriggersResumed(string triggerGroup)
{
//触发器按分组恢复
Console.WriteLine("TriggersResumed");
}
}
}
三、TriggerListener
using Quartz;
namespace QuartzTest
{
class TriggerListener : Quartz.ITriggerListener
{
public string Name => "MyTriggerListener";
public TriggerListener()
{
//初始化,只执行一次
Console.WriteLine("init TriggerListener");
}
public void TriggerComplete(ITrigger trigger, IJobExecutionContext context, SchedulerInstruction triggerInstructionCode)
{
//触发器执行完成
//trigger参数可以获取到触发器的名称和分组,还有关联的Job名称
//context 可以获取到此触发器的本次执行时间,开始时间,结束时间,下一次运行时间等这些参数
Console.WriteLine("TriggerListener TriggerComplete");
}
public void TriggerFired(ITrigger trigger, IJobExecutionContext context)
{
//触发器被触发,准备执行
Console.WriteLine("TriggerListener TriggerFired");
}
public void TriggerMisfired(ITrigger trigger)
{
//触发器错过计划执行时间时
Console.WriteLine("TriggerListener TriggerMisfired");
}
public bool VetoJobExecution(ITrigger trigger, IJobExecutionContext context)
{
//触发器即将执行,
//返回false允许执行
//返回true 本轮拒绝执行
Console.WriteLine("TriggerListener VetoJobExecution");
return false;
}
}
}
四、JobListener
using Quartz;
namespace QuartzTest
{
class JobListener : Quartz.IJobListener
{
public string Name => "MyJobListener";
public JobListener()
{
//初始化
Console.WriteLine("init JobListener");
}
public void JobExecutionVetoed(IJobExecutionContext context)
{
//不知道,正常流程下没有出现过调用
Console.WriteLine("JobListener JobExecutionVetoed");
}
public void JobToBeExecuted(IJobExecutionContext context)
{
//Job即将执行
Console.WriteLine("JobListener JobToBeExecuted");
}
public void JobWasExecuted(IJobExecutionContext context, JobExecutionException jobException)
{
//Job执行完成
Console.WriteLine("JobListener JobWasExecuted");
}
}
}
获取触发器
TriggerKey tk = new TriggerKey("触发器名称");
Scheduler.GetTrigger(tk) //返回一个触发器,能获取到触发器的基础属性资料,但不能获取运行时间这些资料
引用参考
https://www.w3cschool.cn/quartz_doc/
http://www.quartz-scheduler.org/ 这个在国内打开可能很慢