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