使用 Quartz.NET,你可以很容易地安排任務在應用程式啟動時運行,或者每天、每周、每月的特定時間運行,甚至可以基於更複雜的調度規則。 官網:http://www.quartz-scheduler.net/ 實現任務類 創建一個實現了 IJob 介面的類(MailJobTest),該介面包含一個 ...
使用 Quartz.NET,你可以很容易地安排任務在應用程式啟動時運行,或者每天、每周、每月的特定時間運行,甚至可以基於更複雜的調度規則。
官網:http://www.quartz-scheduler.net/
實現任務類
創建一個實現了 IJob 介面的類(MailJobTest),該介面包含一個 Execute 方法,該方法將在作業運行時調用。例如:
using Quartz;
using System;
using System.Threading.Tasks;
using UploadLogiData.Util;
namespace UploadLogiData
{
/// <summary>
/// 郵件任務測試(每天三點固定時間檢測Logi數據併發送內部郵件)
/// </summary>
//對於耗時任務,需要上一次執行完成後,才執行下次任務,覆蓋之前設置的執行周期
[DisallowConcurrentExecution]
public class MailJobTest : IJob
{
public async Task Execute(IJobExecutionContext context)
{
try
{
DisplayListboxMsg("郵箱開始調度");
} catch (Exception ex)
{
UpUtil.LogWrite("ExceptionLog",$"定時器異常_{ex.StackTrace}");
}
}
}
}
實現一個LogiDownloadJob任務類
using MechTE_480.DateTimeCategory;
using Quartz;
using System;
using System.Threading.Tasks;
using UploadLogiData.Util;
namespace UploadLogiData.Quartzs
{
/// <summary>
/// 監聽啟動時間,執行任務下載logi數據
/// </summary>
//對於耗時任務,需要上一次執行完成後,才執行下次任務,覆蓋之前設置的執行周期
[DisallowConcurrentExecution]
public class LogiDownloadJob : IJob
{
public async Task Execute(IJobExecutionContext context)
{
DisplayListboxMsg("啟動時間開始調度");
}
}
}
啟動調度
實例化並啟動調度程式,並調度要執行的作業:
IScheduler scheduler1;
/// <summary>
/// 執行任務調度
/// </summary>
/// <returns></returns>
public async Task ExLogiQuartz()
{
DisplayListboxMsg("檢測任務啟動!");
//1、創建一個調度
var factory = new StdSchedulerFactory();
var scheduler = await factory.GetScheduler();
await scheduler.Start();
//2、創建一個任務
var job = JobBuilder.Create<LogiDownloadJob>()
.WithIdentity("LogiJob","LogiGroup")
.Build();
//3、創建一個觸發器
var trigger = TriggerBuilder.Create()
.WithIdentity("LogiTrigger","LogiTriggerGroup")
.WithCronSchedule("0/5 * * * * ?") //5秒執行一次
.Build();
await scheduler.ScheduleJob(job,trigger);
// 第二個任務
var job2 = JobBuilder.Create<MailJobTest>()
.WithIdentity("MailJob","MailGroup")
.Build();
//3、創建一個觸發器
var trigger2 = TriggerBuilder.Create()
.WithIdentity("MailTrigger","MailTriggerGroup")
.WithCronSchedule("0/5 * * * * ?") //5秒執行一次
.Build();
await scheduler.ScheduleJob(job2,trigger2);
scheduler1 = scheduler; // 對象賦值
}
為作業指定身份:
var job = JobBuilder.Create<SimpleJob>()
.WithIdentity("LogiJob","LogiGroup") // // 作業名稱為 "LogiJob",組名為 "LogiGroup"
.Build();
為觸發器指定身份:
ITrigger trigger = TriggerBuilder.Create()
.WithIdentity("myTrigger", "myTriggerGroup") // 觸發器名稱為 "myTrigger",組名為 "myTriggerGroup"
.StartNow()
.WithSimpleSchedule(x => x.WithIntervalInHours(1).RepeatForever())
.Build();
創建第二個任務:
// 創建並調度第二個作業
// 第二個任務
var job2 = JobBuilder.Create<MailJobTest>()
.WithIdentity("MailJob","MailGroup")
.Build();
//3、創建一個觸發器
var trigger2 = TriggerBuilder.Create()
.WithIdentity("MailTrigger","MailTriggerGroup")
.WithCronSchedule("0/5 * * * * ?") //5秒執行一次
.Build();
await scheduler.ScheduleJob(job2,trigger2);
// 可以繼續添加更多的作業和觸發器...
重要性
- 唯一性:確保每個作業和觸發器在調度器中具有唯一的標識,從而避免衝突。
- 組織性:通過組名,可以將相關的作業或觸發器組織在一起,便於管理。
- 靈活性:通過使用不同的組,可以輕鬆地啟用、禁用或刪除一組相關的作業或觸發器。
- 查詢和更新:有了明確的身份標識,可以更容易地查詢作業或觸發器的狀態,或者對其進行更新。
取消任務調度
// 關閉
scheduler1.Shutdown().Wait();
//方法外部訪問調度器實例
IScheduler scheduler1;
public async void ExQuartz()
{
DisplayListboxMsg("檢測任務啟動!");
//1、創建一個調度
var factory = new StdSchedulerFactory();
var scheduler = await factory.GetScheduler();
await scheduler.Start();
//2、創建一個任務
var job = JobBuilder.Create<SimpleJob>()
.WithIdentity("job1","group1")
.Build();
//3、創建一個觸發器
var trigger = TriggerBuilder.Create()
.WithIdentity("trigger1","group1")
.WithCronSchedule("0/2 * * * * ?") //5秒執行一次
.Build();
await scheduler.ScheduleJob(job,trigger);
scheduler1 = scheduler; // 對象賦值
}
把ExQuartz封裝到類裡面
ExLogiQuartz
方法示例,同時考慮了scheduler
的存儲和訪問:
QuartzScheduler類中
using Quartz;
using Quartz.Impl;
using System.Threading.Tasks;
namespace UploadLogiData.Quartzs
{
/// <summary>
/// 封裝了ExLogiQuartz方法和對scheduler的訪問
/// </summary>
public class QuartzScheduler
{
/// <summary>
/// 方法外部訪問調度器實例
/// </summary>
IScheduler logiScheduler;
//先靜態定義一下主窗體
public static Form1 form;
public async Task ExLogiQuartz()
{
form.DisplayListboxMsg("檢測任務啟動!");
// 創建一個調度器實例
var factory = new StdSchedulerFactory();
logiScheduler = await factory.GetScheduler();
await logiScheduler.Start();
// 創建一個任務:LogiDownloadJob,每5秒執行一次
var job = JobBuilder.Create<LogiDownloadJob>()
.WithIdentity("LogiJob","LogiGroup")
.Build();
var trigger = TriggerBuilder.Create()
.WithIdentity("LogiTrigger","LogiTriggerGroup")
.WithCronSchedule("0/5 * * * * ?") // 5秒執行一次
.Build();
await logiScheduler.ScheduleJob(job,trigger);
// 創建第二個任務:MailJobTest,每天下午3點10分執行一次
var job2 = JobBuilder.Create<MailJobTest>()
.WithIdentity("MailJob","MailGroup")
.Build();
var trigger2 = TriggerBuilder.Create()
.WithIdentity("MailTrigger","MailTriggerGroup")
.WithCronSchedule("0 10 15 * * ?") // 每天下午3點10分執行一次
.Build();
await logiScheduler.ScheduleJob(job2,trigger2);
// 如果需要在其他地方訪問scheduler,可以通過類屬性或方法獲取
}
public IScheduler Scheduler => logiScheduler;
}
}
調用示例
// 使用示例
public class Program
{
public static async Task Main(string[] args)
{
var quartzScheduler = new QuartzScheduler();
await quartzScheduler.ExLogiQuartz();
// 如果需要在其他地方訪問scheduler,可以通過以下方式獲取
var scheduler = quartzScheduler.Scheduler;
// 如調用關閉
quartzScheduler.Scheduler.Shutdown().Wait();
// 其他邏輯...
}
}