LindDotNetCore~Scheduling任務排程模組的介紹
阿新 • • 發佈:2018-12-29
任務排程元件
- 位於Scheduling目錄
- 基類JobBase,所有JOB都派生自它,重寫Cron屬性可以修改排程週期
- 支援單次JOB,即執行完成後馬上停止
- 支援對外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");
}
}
待續……
回到目錄