定時處理組件---Quartz.net

1.認識任務調度

     所謂任務調度,就是以將業務區塊任務化(即抽象成每個獨立的任務,執行每一個任務便完成某種業務的需求)。好比,咱們有一個訂單系統,如今有這樣的一個需求,就是須要在某一時間點去掃描數據庫,刪掉垃圾訂單。又好比,咱們想要在某一時刻去批量給用戶推送信息,等等等等。如何去解決那??咱們首先想到的是利用定時器或者是開線程獨立掃描。這能夠說是解決方案,可是若是是本身去實現,不免考慮的不周全。因而,Quartz.net應運而生。java

2.Quartz.net瞭解

     Quartz.NET是java的Quartz移植過來的開源的做業調度框架的.net版本,是很是適合在平時的工做中,定時輪詢數據庫同步,定時郵件通知,定時處理數據等。 Quartz.NET容許開發人員根據時間間隔(或天)來調度做業。它實現了做業和觸發器的多對多關係,還能把多個做業與不一樣的觸發器關聯。整合了 Quartz.NET的應用程序能夠重用來自不一樣事件的做業,還能夠爲一個事件組合多個做業。其實使用起來很簡單,只要瞭解其中的幾個概念點,就能夠輕鬆的使用。數據庫

    (1).Scheduler:調度器,用來將任務和觸發器綁定關聯起來的中樞系統。api

  (2).Trigger:觸發器,定義任務的執行條件。框架

  (3).JobDetail:任務構建模型,用來裝載實現定義好的任務的。ui

3.Quartz.net使用

     使用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();

4.Quartz.net的簡單封裝

    這裏,我對基礎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);
        }
    }
相關文章
相關標籤/搜索