Quartz開發-插件開發

開發環境

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章