一 開發概述html
對於具備必定規模的大多數企業來講,存在着這樣一種需求:存在某個或某些任務,須要系統按期,自動地執行,然而,對大多數企業來講,該技術的實現,倒是他們面臨的一大難點和挑戰。java
對於大部分企業來講,實現如上功能,挑戰在哪裏?windows
挑戰一:如何作一個自動服務的系統?框架
是從0到1開發(費時費力花錢,還不必定開發成功,即便開發成功,也未必好用),仍是購買第三方服務(花錢)。分佈式
挑戰二:如何實現複雜的「按期規則」?ide
對於簡單的按期規則,能夠藉助於windows自帶的執行計劃來執行,但如果複雜的按期規則,windows執行計劃未必可行,然而,Quartz的cron卻很好地解決了該問題,學習
(能夠說,cron在表達時間規則方面,無所不能),除此以外,Quartz能很好地配合windows執行計劃,實現系統的按期,自動執行任務。測試
經過如上概述,咱們知道Quartz能很好地解決該問題,那麼,什麼是Quartz呢?spa
簡言之,Quartz就是一種任務調度計劃。.net
本篇文章,主要從Quartz框架核心組件,Quartz基本運行原理,Quartz核心概念和Quartz基本功能實現(代碼)等方面來介紹Quartz。
二 Quartz
當要深刻研究一個技術時,研究它的體系結構和內部運行原理,不失爲一種較好的方式。同理,咱們在研究Quartz時,也採用相似的方法,
下圖爲Quartz的大體結構圖。
(一)Quartz關鍵組件
Quartz比較關鍵的兩個核心組件分別爲Job和Trigger
(二)Quartz幾個關鍵概念
1.IJob
IJob表示一個接口,該接口只有一個方法簽名
public interface IJob { void Execute(JobExecutionContext context); }
在Quartz中,全部的job任務,必須實現該接口
public class MyJob : IJob { public void Execute(JobExecutionContext context) { Console.WriteLine("Quartz基本功能測試。"); } }
2.JobDetail
JobDetail,顧名思義,就是表示關於每一個Job的相關信息,它主要包括兩個核心組件,即Job Task和JobData Map
3.Trigger
Trigger,表示觸發器,根據配置規則來觸發執行計劃調度job,它主要包括兩個核心組件,即SimpleTrigger和CronTrigger
4.IJobStore
IJobStore,表述任務存儲器,主要存儲job和trigger相關信息。
5.ISchedulerFactory
ISchedulerFactory,表示任務計劃工廠,用來管理任務計劃IScheduler。
6.IScheduler
IScheduler,表述任務計劃,它至關於一個容器,具體job和job相關trigger就可以被注入其中,從而實現任務計劃調度。其主要經常使用的方法:
接口Code:
namespace Quartz { public interface IScheduler { bool IsStarted { get; } string SchedulerName { get; } string SchedulerInstanceId { get; } bool InStandbyMode { get; } bool IsShutdown { get; } IJobFactory JobFactory { set; } string[] JobGroupNames { get; } string[] TriggerGroupNames { get; } SchedulerContext Context { get; } IList GlobalJobListeners { get; } string[] CalendarNames { get; } IList GlobalTriggerListeners { get; } ISet TriggerListenerNames { get; } ISet JobListenerNames { get; } IList SchedulerListeners { get; } void AddCalendar(string calName, ICalendar calendar, bool replace, bool updateTriggers); void AddGlobalJobListener(IJobListener jobListener); void AddGlobalTriggerListener(ITriggerListener triggerListener); void AddJob(JobDetail jobDetail, bool replace); void AddJobListener(IJobListener jobListener); void AddSchedulerListener(ISchedulerListener schedulerListener); void AddTriggerListener(ITriggerListener triggerListener); bool DeleteCalendar(string calName); bool DeleteJob(string jobName, string groupName); ICalendar GetCalendar(string calName); string[] GetCalendarNames(); IList GetCurrentlyExecutingJobs(); IJobListener GetGlobalJobListener(string name); ITriggerListener GetGlobalTriggerListener(string name); JobDetail GetJobDetail(string jobName, string jobGroup); IJobListener GetJobListener(string name); string[] GetJobNames(string groupName); SchedulerMetaData GetMetaData(); ISet GetPausedTriggerGroups(); Trigger GetTrigger(string triggerName, string triggerGroup); ITriggerListener GetTriggerListener(string name); string[] GetTriggerNames(string groupName); Trigger[] GetTriggersOfJob(string jobName, string groupName); TriggerState GetTriggerState(string triggerName, string triggerGroup); bool Interrupt(string jobName, string groupName); bool IsJobGroupPaused(string groupName); bool IsTriggerGroupPaused(string groupName); void PauseAll(); void PauseJob(string jobName, string groupName); void PauseJobGroup(string groupName); void PauseTrigger(string triggerName, string groupName); void PauseTriggerGroup(string groupName); bool RemoveGlobalJobListener(IJobListener jobListener); bool RemoveGlobalJobListener(string name); bool RemoveGlobalTriggerListener(ITriggerListener triggerListener); bool RemoveGlobalTriggerListener(string name); bool RemoveJobListener(string name); bool RemoveSchedulerListener(ISchedulerListener schedulerListener); bool RemoveTriggerListener(string name); DateTime? RescheduleJob(string triggerName, string groupName, Trigger newTrigger); void ResumeAll(); void ResumeJob(string jobName, string groupName); void ResumeJobGroup(string groupName); void ResumeTrigger(string triggerName, string groupName); void ResumeTriggerGroup(string groupName); DateTime ScheduleJob(Trigger trigger); DateTime ScheduleJob(JobDetail jobDetail, Trigger trigger); void Shutdown(bool waitForJobsToComplete); void Shutdown(); void Standby(); void Start(); void StartDelayed(TimeSpan delay); void TriggerJob(string jobName, string groupName); void TriggerJob(string jobName, string groupName, JobDataMap data); void TriggerJobWithVolatileTrigger(string jobName, string groupName); void TriggerJobWithVolatileTrigger(string jobName, string groupName, JobDataMap data); bool UnscheduleJob(string triggerName, string groupName); } }
(三)核心UML圖
1.命名空間
不一樣版本的Quartz命名空間有所區別,但差異不大,以下爲版本1.0.3命名空間
using Quartz; using Quartz.Core; using Quartz.Impl; using Quartz.Impl.AdoJobStore; using Quartz.Impl.AdoJobStore.Common; using Quartz.Impl.Calendar; using Quartz.Impl.Matchers; using Quartz.Impl.Triggers; using Quartz.Listener; using Quartz.Logging; using Quartz.Logging.LogProviders; using Quartz.Simpl; using Quartz.Spi; using Quartz.Util; using Quartz.Xml; using Quartz.Xml.JobSchedulingData20; using System;
2.關鍵組件繼承關係
在Quartz中,許多組件是能夠經過配置來促使做業執行的,如線程程序(Tread Procedure)決定如何執行計劃任務線程(Quartz Scheduler Thread)
三 代碼
本示例,咱們將使用.net 控制檯程序,基於VS2017來使用Quartz創建一個任務:
任務要求:要求在控制檯每隔2秒輸出:Quartz基本功能測試。
1.首先使用Nuget下載Quartz
本示例使用的Quartz版本爲1.0.3
2.按照以下步驟操做
代碼:
第一階段:建立實現IJob接口的MyJob類
public class MyJob : IJob { public void Execute(JobExecutionContext context) { Console.WriteLine("Quartz基本功能測試。"); } }
第二階段:按規則調用Quartz組件
static void Main(string[] args) { //每一個2秒執行一次 string cronParam = "*/2 * * * * ?"; //建立計劃任務抽象工廠 ISchedulerFactory sf = new StdSchedulerFactory(); //建立計劃任務 IScheduler sched = sf.GetScheduler(); //建立job JobDetail job = new JobDetail("myJob","group", typeof(MyJob)); //建立觸發器 Trigger trigger = new CronTrigger("myTrigger","group",cronParam); //將job和trigger注入到計劃任務中 sched.ScheduleJob(job, trigger); //啓動計劃任務 sched.Start(); //關閉計劃任務 //sched.Shutdown(); Console.Read(); }
3.測試結果
四 參考文獻
【01】http://www.quartz-scheduler.org/
【02】https://www.ibm.com/developerworks/library/j-quartz/index.html
【03】https://www.w3cschool.cn/quartz_doc/
五 版權區