背景
很多時候,項目需要在不同時刻,執行一個或很多個不同的作業。
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