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