一 開發概述 對於具有一定規模的大多數企業來說,存在著這樣一種需求:存在某個或某些任務,需要系統定期,自動地執行,然而,對大多數企業來說,該技術的實現,卻是他們面臨的一大難點和挑戰。 對於大部分企業來說,實現如上功能,挑戰在哪裡? 挑戰一:如何做一個自動服務的系統? 是從0到1開發(費時費力花錢,還 ...
一 開發概述
對於具有一定規模的大多數企業來說,存在著這樣一種需求:存在某個或某些任務,需要系統定期,自動地執行,然而,對大多數企業來說,該技術的實現,卻是他們面臨的一大難點和挑戰。
對於大部分企業來說,實現如上功能,挑戰在哪裡?
挑戰一:如何做一個自動服務的系統?
是從0到1開發(費時費力花錢,還不一定開發成功,即使開發成功,也未必好用),還是購買第三方服務(花錢)。
挑戰二:如何實現複雜的“定期規則”?
對於簡單的定期規則,可以藉助於windows自帶的執行計劃來執行,但若是複雜的定期規則,windows執行計劃未必可行,然而,Quartz的cron卻很好地解決了該問題,
(可以說,cron在表達時間規則方面,無所不能),除此之外,Quartz能很好地配合windows執行計劃,實現系統的定期,自動執行任務。
通過如上概述,我們知道Quartz能很好地解決該問題,那麼,什麼是Quartz呢?
簡言之,Quartz就是一種任務調度計劃。
- 它是由OpenSymphony提供的、開源的、java編寫的強大任務調度框架
- 幾乎可以集成到任何規模的運用程式中,如簡單的控制台程式,複雜的大規模分散式電子商務系統
- 可用於創建簡單的或複雜的計劃任務
- 包含很多企業級功能,如支持JTA和集群等
本篇文章,主要從Quartz框架核心組件,Quartz基本運行原理,Quartz核心概念和Quartz基本功能實現(代碼)等方面來介紹Quartz。
二 Quartz
當要深入研究一個技術時,研究它的體繫結構和內部運行原理,不失為一種較好的方式。同理,我們在研究Quartz時,也採用類似的方法,
下圖為Quartz的大致結構圖。
(一)Quartz關鍵組件
Quartz比較關鍵的兩個核心組件分別為Job和Trigger
- 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就能夠被註入其中,從而實現任務計劃調度。其主要常用的方法:
- Start --啟動執行計劃
- Shutdowm --關閉執行計劃
介面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); } }View Code
(三)核心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/
五 版權區
- 感謝您的閱讀,若有不足之處,歡迎指教,共同學習、共同進步。
- 博主網址:http://www.cnblogs.com/wangjiming/。
- 極少部分文章利用讀書、參考、引用、抄襲、複製和粘貼等多種方式整合而成的,大部分為原創。
- 如您喜歡,麻煩推薦一下;如您有新想法,歡迎提出,郵箱:[email protected]。
- 可以轉載該博客,但必須著名博客來源。