"回到目錄" 任務調度組件 1. 位於Scheduling目錄 2. 基類JobBase,所有JOB都派生自它,重寫Cron屬性可以修改調度周期 3. 支持單次JOB,即執行完成後馬上停止 4. 支持對外API介面,以便獲取和修改JOB的列表的狀態 源代碼展現 自定義Job在繼承JobBase之後, ...
任務調度組件
- 位於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");
}
}
待續……
回到目錄