一 開發概述
對于具有一定規模的大多數企業來說,存在着這樣一種需求:存在某個或某些任務,需要系統定期,自動地執行,然而,對大多數企業來說,該技術的實作,卻是他們面臨的一大難點和挑戰。
![]()
淺談Quartz定時任務排程 對于大部分企業來說,實作如上功能,挑戰在哪裡?
挑戰一:如何做一個自動服務的系統?
是從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]。
- 可以轉載該部落格,但必須著名部落格來源。