背景
很多時候,專案需要在不同時刻,執行一個或很多個不同的作業。
Windows執行計劃這時並不能很好的滿足需求了,迫切需要一個更為強大,方便管理,叢集部署的作業排程框架。
介紹
Quartz一個開源的作業排程框架,OpenSymphony的開源專案。Quartz.Net 是Quartz的C#移植版本。
它一些很好的特性:
1:支援叢集,作業分組,作業遠端管理。
2:自定義精細的時間觸發器,使用簡單,作業和觸發分離。
3:資料庫支援,可以寄宿Windows服務,WebSite,winform等。
實戰
Quartz框架的一些基礎概念解釋:
Scheduler 作業排程器。
IJob 作業介面,繼承並實現Execute, 編寫執行的具體作業邏輯。
JobBuilder 根據設定,生成一個詳細作業資訊(JobDetail)。
TriggerBuilder 根據規則,生產對應的Trigger
Nuget安裝
PM> Install-Package Quartz
下面是簡單使用例子,附帶詳細的註釋:
static void Main(string[] args) { //從工廠中獲取一個排程器例項化 IScheduler scheduler = StdSchedulerFactory.GetDefaultScheduler(); scheduler.Start(); //開啟排程器 //==========例子1(簡單使用)=========== IJobDetail job1 = JobBuilder.Create<HelloJob>() //建立一個作業 .WithIdentity("作業名稱", "作業組") .Build(); ITrigger trigger1 = TriggerBuilder.Create() .WithIdentity("觸發器名稱", "觸發器組") .StartNow() //現在開始 .WithSimpleSchedule(x => x //觸發時間,5秒一次。 .WithIntervalInSeconds(5) .RepeatForever()) //不間斷重複執行 .Build(); scheduler.ScheduleJob(job1, trigger1); //把作業,觸發器加入排程器。 //==========例子2 (執行時 作業資料傳遞,時間表示式使用)=========== IJobDetail job2= JobBuilder.Create<DumbJob>() .WithIdentity("myJob", "group1") .UsingJobData("jobSays", "Hello World!") .Build(); ITrigger trigger2 = TriggerBuilder.Create() .WithIdentity("mytrigger", "group1") .StartNow() .WithCronSchedule("/5 * * ? * *") //時間表示式,5秒一次 .Build(); scheduler.ScheduleJob(job2, trigger2); //scheduler.Shutdown(); //關閉排程器。 }
宣告要執行的作業,HelloJob:
/// <summary> /// 作業 /// </summary> public class HelloJob : IJob { public void Execute(IJobExecutionContext context) { Console.WriteLine("作業執行!"); } }
宣告要執行的作業,DumbJob:
public class DumbJob : IJob { /// <summary> /// context 可以獲取當前Job的各種狀態。 /// </summary> /// <param name="context"></param> public void Execute(IJobExecutionContext context) { JobDataMap dataMap = context.JobDetail.JobDataMap; string content = dataMap.GetString("jobSays"); Console.WriteLine("作業執行,jobSays:" + content); } }
其WithCronSchedule("") 擁有強大的Cron時間表示式,正常情況下WithSimpleSchedule(x) 已經滿足大部分對日期設定的要求了。
Quartz.Net官方2.X教程 http://www.quartz-scheduler.net/documentation/quartz-2.x/tutorial/index.html
Quartz.Net開源地址 https://github.com/quartznet/quartznet