控制台基於Quartz.Net組件實現定時任務調度(一)

  • 2019 年 10 月 3 日
  • 筆記

前言

   你曾經需要應用執行一個任務嗎?比如現在有一個需求,需要每天在零點定時執行一些操作,那應該怎樣操作呢?

   這個時候,如果你和你的團隊是用.NET編程的話,可以考慮使用Quartz.NET調度器。允許開發人員根據日期間隔來實現任務調度任務。非常適合在平時的工作中,定時輪詢資料庫同步,定時郵件通知,定時處理數據等。

   Quartz一個開源的作業調度框架,是OpenSymphony 的 Quartz API的.NET移植每隔,基於C#寫成,可應用於winform、asp.net、asp.net core應用中。提供了巨大的靈活性,是一個更為強大,方便管理,集群部署的作業調度框架。

所以,有時候項目需要在不同時刻,執行一個或很多個不同的作業,你可以用它來完成執行創建簡單或複雜的任務調度。

導圖

特性

1:支援集群,作業分組,作業遠程管理。 

2:自定義精細的時間觸發器,使用簡單,作業和觸發分離。

3:資料庫支援,可以寄宿Windows服務,WebSite,winform等。

概念

Scheduler        作業調度器

所有的scheduler都應該由SchedulerFactory來創建

 //創建scheduler              Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();

IJob             作業介面,繼承並實現Execute, 編寫執行的具體作業邏輯。

通過實現IJob介面來使你的.NET組件可以很簡單地被scheduler執行

    public class ConsoleJob : IJob      {          public Task Execute(IJobExecutionContext context)          {              return Console.Out.WriteLineAsync($"執行作業");          }      }

JobBuilder       根據設置,生成一個詳細作業資訊(JobDetail)。

JobBuilder是一個建造者模式,鏈式建造。通過靜態方法構建一個JobBuilder實例,然後再調用類方法Build()創建一個IJobDetail的實現。

public static JobBuilder Create(Type jobType)  {      JobBuilder b = new JobBuilder();      b.OfType(jobType);      return b;  }

TriggerBuilder   根據規則,生產對應的Trigger,觸發器可以規劃執行任務

 

通過靜態方法構建一個TriggerBuilder實例,然後再調用類方法Build()創建一個ITrigger的實現。

public static TriggerBuilder Create()  {      return new TriggerBuilder();  }

 根據任務設置觸發的開始時間和結束時間

    /// <summary>      /// 開始時間      /// </summary>      /// <param name="startTimeUtc"></param>      /// <returns></returns>      public TriggerBuilder StartAt(DateTimeOffset startTimeUtc)      {          startTime = startTimeUtc;          return this;      }      /// <summary>      /// 結束時間      /// </summary>      /// <param name="endTimeUtc"></param>      /// <returns></returns>      public TriggerBuilder EndAt(DateTimeOffset? endTimeUtc)      {          endTime = endTimeUtc;          return this;      }

步驟

1、創建一個ISchedulerFactory,然後並且獲取 Scheduler

2、啟動 Scheduler

3、創建 job 任務

4、創建 trigger 觸發器

5、使用觸發器規劃執行任務

開始

注意

新建一個Quartz項目後,需要安裝下面的程式包:

你可以用控制台命令的方式安裝

Install-Package Quartz

也可以使用下面這種方式選擇安裝版本

一、創建一個scheduler的引用

            ISchedulerFactory schedFact = new StdSchedulerFactory();              IScheduler sched = await schedFact.GetScheduler();

二、啟動 scheduler:

            await sched.Start();

三、實現IJob:

ConsoleJob.cs 實現IJob,在Execute方法里編寫要處理的業務邏輯,系統就會按照Quartz的配置,定時處理

    /// <summary>      /// 實現IJob,Execute方法里編寫要處理的業務邏輯      /// </summary>      public class ConsoleJob : IJob      {          public Task Execute(IJobExecutionContext context)          {              return Console.Out.WriteLineAsync($"ConsoleJob執行工作 在當前時間{DateTime.Now}--上一次執行時間:{DateTime.Now.AddSeconds(-5)}");          }      }

四、創建trigger:(建立一個某個時間點的觸發器,並且每5秒執行一次)

            ITrigger trigger = TriggerBuilder.Create()                  .WithIdentity("trigger1", "group1")  //觸發器 組                  .WithSimpleSchedule(x => x.WithIntervalInSeconds(5).RepeatForever())                  .Build();

五、觸發器執行任務:

            await sched.ScheduleJob(job, trigger);

將幾個步驟整合後程式碼如下:

        /// <summary>          /// 任務調度的使用過程          /// </summary>          /// <returns></returns>          public async static Task Run()          {              // 1.創建scheduler的引用              ISchedulerFactory schedFact = new StdSchedulerFactory();              IScheduler sched = await schedFact.GetScheduler();                  //2.啟動 scheduler              await sched.Start();                // 3.創建 job              IJobDetail job = JobBuilder.Create<ConsoleJob>()                      .WithIdentity("job1", "group1")                      .Build();                // 4.創建 trigger (創建 trigger 觸發器)              ITrigger trigger = TriggerBuilder.Create()                  .WithIdentity("trigger1", "group1")  //觸發器 組                  .WithSimpleSchedule(x => x.WithIntervalInSeconds(5).RepeatForever())                  .Build();                // 5.使用trigger規劃執行任務job (使用觸發器規劃執行任務)              await sched.ScheduleJob(job, trigger);          }

運行

間隔5秒執行一次後的效果:

附加

這裡使用的quartz為3.x 版本,整個版本相對於2.0版本進行了大量的修改,正式支援了.NET Core 和async/await

引用張隊文章的內容:

總結

1.其實在實際項目中,可以將上面的方法進行封裝處理,形成不同的任務,特別是處理多任務的時候,在不同的job中調用不同的trigger,後續會繼續完善開發

2.quartz還有更多的用法,可以參考資料:Quartz.Net官方文檔   和  Quartz.Net開源地址

3.項目源碼地址