所謂任務調度,就是以將業務區塊任務化(即抽象成每個獨立的任務,執行每一個任務便完成某種業務的需求)。好比,咱們有一個訂單系統,如今有這樣的一個需求,就是須要在某一時間點去掃描數據庫,刪掉垃圾訂單。又好比,咱們想要在某一時刻去批量給用戶推送信息,等等等等。如何去解決那??咱們首先想到的是利用定時器或者是開線程獨立掃描。這能夠說是解決方案,可是若是是本身去實現,不免考慮的不周全。因而,Quartz.net應運而生。java
Quartz.NET是java的Quartz移植過來的開源的做業調度框架的.net版本,是很是適合在平時的工做中,定時輪詢數據庫同步,定時郵件通知,定時處理數據等。 Quartz.NET容許開發人員根據時間間隔(或天)來調度做業。它實現了做業和觸發器的多對多關係,還能把多個做業與不一樣的觸發器關聯。整合了 Quartz.NET的應用程序能夠重用來自不一樣事件的做業,還能夠爲一個事件組合多個做業。其實使用起來很簡單,只要瞭解其中的幾個概念點,就能夠輕鬆的使用。數據庫
(1).Scheduler:調度器,用來將任務和觸發器綁定關聯起來的中樞系統。api
(2).Trigger:觸發器,定義任務的執行條件。框架
(3).JobDetail:任務構建模型,用來裝載實現定義好的任務的。ui
使用nuget包管理器安裝quartz.net,而後引用using Quartz、using Quartz.Impl.。其使用流程即是(繼承IJob,重寫Excute方法-->構建Scheduler-->構建JobDetail-->構建Trigger-->利用Scheduler綁定Trigger與JobDetail-->開啓調度)接下來,咱們來熟悉一下核心的模型及api。.net
IJob:任務基礎接口,我沒定義的每個任務,都須要繼承該接口,並重寫Excute方法,並在其中書寫本身的業務邏輯。線程
IScheduler:調度器;orm
StdSchedulerFactory:調度器構建/獲取工廠,咱們能夠經過經過Scheduler = StdSchedulerFactory.GetDefaultScheduler();獲取一個默認的調度器,經過Scheduler.Start()開啓調度,而後經過 Scheduler.ScheduleJob("任務模型",「觸發器模型」)來關聯觸發器與任務。對象
ITrigger:觸發器;blog
TriggerBuilder:觸發器構造器,經過ITrigger trigger =TriggerBuilder.Create().WithIdentity("觸發器名稱,"「觸發器分組名稱」).WithCronSchedule("cron表達式,觸發的條件").Build();構建一個觸發器
IJobDetail:任務模型。
JobDetailBuilder:任務構造模型,經過 IJobDetail jobDetail = JobBuilder.Create("自定義的任務對象類型").SetJobData("要傳給任務的執行所需的參數對象").WithIdentity("任務名稱", "任務分組名").Build();
這裏,我對基礎api簡單的封裝啦一下,方便使用(JobConfig-->任務參數配置模型,QuartzUtil-->核心幫助文件)。
/// <summary> /// 任務配置對象 /// </summary> public class JobConfig { public JobConfig() { JobDataMap = new JobDataMap(); } public string JobName { get; set; }//任務名稱 public string JobGroup { get; set; }//任務分組名 public string TriggerName { get; set; }//觸發器名 public string TriggerGroup { get; set; }//觸發器分組名 public string CronExpression { get; set; }//cron表達式 public Type JobType { get; set; }//任務類型 public JobDataMap JobDataMap { get; set; } //任務參數map }
public class QuartzUtil { private static IScheduler Scheduler { get; set; } static QuartzeUtil() { Scheduler = StdSchedulerFactory.GetDefaultScheduler(); Scheduler.Start(); } /// <summary> /// 添加任務 /// </summary> /// <param name="jobConfig"></param> /// <returns></returns> public static bool AddJob(JobConfig jobConfig) { try { ITrigger trigger = TriggerBuilder.Create() .WithIdentity(jobConfig.TriggerName, jobConfig.TriggerGroup) .WithCronSchedule(jobConfig.CronExpression).Build(); IJobDetail jobDetail = JobBuilder.Create(jobConfig.JobType).SetJobData(jobConfig.JobDataMap).WithIdentity(jobConfig.JobName, jobConfig.JobGroup).Build(); Scheduler.ScheduleJob(jobDetail, trigger); return true; } catch (Exception ex) { Console.WriteLine(ex.Message); return false; } } /// <summary> /// 構建cons表達式 /// </summary> /// <param name="dateTime"></param> /// <returns></returns> public static string BuildConsExpression(DateTime dateTime) { return string.Format("{0} {1} {2} {3} {4} ? {5}", dateTime.Second, dateTime.Minute, dateTime.Hour, dateTime.Day, dateTime.Month, dateTime.Year); } /// <summary> /// 移除任務 /// </summary> /// <param name="jobConfig"></param> /// <returns></returns> public static bool RemoveJob(JobConfig jobConfig) { try { TriggerKey triggerKey = new TriggerKey(jobConfig.TriggerName, jobConfig.TriggerGroup); Scheduler.PauseTrigger(triggerKey); Scheduler.ResumeTrigger(triggerKey); Scheduler.DeleteJob(JobKey.Create(jobConfig.JobName, jobConfig.JobGroup)); return true; } catch (Exception ex) { return false; } } /// <summary> /// 構建觸發器 /// </summary> /// <param name="triggerName"></param> /// <param name="groupName"></param> /// <param name="cronExpression"></param> /// <returns></returns> public static ITrigger BuildTrigger(string triggerName, string groupName, string cronExpression) { ITrigger trigger = TriggerBuilder.Create() .WithIdentity(triggerName, groupName) .WithCronSchedule(cronExpression).Build(); return trigger; } /// <summary> /// 構建任務 /// </summary> /// <param name="jobName"></param> /// <param name="groupName"></param> /// <param name="jobType"></param> /// <returns></returns> public static IJobDetail BuildJob(string jobName, string groupName, Type jobType) { IJobDetail jobDetail = JobBuilder.Create(jobType).WithIdentity(jobName, groupName).Build(); return jobDetail; } /// <summary> /// 綁定任務與觸發器 /// </summary> /// <param name="jobDetail"></param> /// <param name="trigger"></param> public static void BindJobAndTrigger(IJobDetail jobDetail, ITrigger trigger) { Scheduler.ScheduleJob(jobDetail, trigger); } }