1. 程式人生 > >LindDotNetCore~Scheduling任務排程模組的介紹

LindDotNetCore~Scheduling任務排程模組的介紹

回到目錄

任務排程元件

  1. 位於Scheduling目錄
  2. 基類JobBase,所有JOB都派生自它,重寫Cron屬性可以修改排程週期
  3. 支援單次JOB,即執行完成後馬上停止
  4. 支援對外API介面,以便獲取和修改JOB的列表的狀態

原始碼展現

自定義Job在繼承JobBase之後,可以設定自動的名稱,排程週期,是否單次,
和執行過程.

  public abstract class JobBase : ISchedulingJob
 {
     /// <summary>
     /// 執行計劃,除了立即執行的JOB之後,其它JOB需要實現它
     /// </summary>
     public abstract string Cron { get; }
 
     /// <summary>
     /// 是否為單次任務,黑為false
     /// </summary>
     public virtual bool IsSingle => false;
 
     /// <summary>
     /// Job的名稱,預設為當前類名
     /// </summary>
     public virtual string JobName => GetType().Name;
 
     /// <summary>
     /// Job具體類去實現自己的邏輯
     /// </summary>
     protected abstract void ExcuteJob(IJobExecutionContext context);
 
     public Task Execute(IJobExecutionContext context)
     {
         try
         {
             Console.WriteLine(DateTime.Now.ToString() + "{0}這個Job開始執行", context.JobDetail.Key.Name);
             ExcuteJob(context);
         }
         catch (Exception ex)
         {
             Console.WriteLine(this.GetType().Name + "error:" + ex.Message);
         }
 
         return Task.CompletedTask;
     }
 
 }

支援新Job自動裝載

我們新新增的job,可以與當前job並行,你在新的專案中新增job之後,把它
複製到排程中心程式後,中心程式的發現機制會把新地Job裝載到時佇列裡,
在新的週期到來時候,去動態執行!

 var watcher = new FileSystemWatcher
 {
     Path = AppDomain.CurrentDomain.BaseDirectory,
     NotifyFilter = NotifyFilters.Attributes |
     NotifyFilters.CreationTime |
     NotifyFilters.DirectoryName |
     NotifyFilters.FileName |
     NotifyFilters.LastAccess |
     NotifyFilters.LastWrite |
     NotifyFilters.Security |
     NotifyFilters.Size,
     Filter = "*.dll"
 };
 watcher.Created += new FileSystemEventHandler((o, e) =>
 {
     foreach (var module in Assembly.LoadFile(e.FullPath).GetModules())
     {
         foreach (var type in module.GetTypes().Where(i => typeof(ISchedulingJob).IsAssignableFrom(i)))
         {
             JoinToQuartz(type, DateTimeOffset.Now);
         }
     }
 });

Demo的設計很簡單,只要實現JobBase的屬性和方法即可,下面的Job為每分鐘執行一次

 public class HelloJob : JobBase
 {
     public override string Cron => "0 0/1 * * * ?";
     protected override void ExcuteJob(IJobExecutionContext context)
     {
         Console.WriteLine("hello");
     }
 }

待續……
回到目錄