Quartz.NET 是一個用於調度任務和作業的開源框架,它允許開發人員創建簡單或複雜的調度方案,例如定時執行任務,定時觸發作業等。
創建調度器很簡單需要三個對象: IScheduler、IJob、ITrigger,直接上代碼,使用可根據需求再擴展
using Quartz; using Quartz.Impl; using QuartzScheduler.Job; using QuartzScheduler.Listener; namespace QuartzScheduler { /// <summary> /// 調度器 /// </summary> public class MyScheduler { /// <summary> /// 創建調度器 /// </summary> public async static Task SchedulerAction() { //IScheduler StdSchedulerFactory stdScheduler = new StdSchedulerFactory(); IScheduler scheduler = await stdScheduler.GetScheduler(); await scheduler.Start(); //添加監聽器 scheduler.ListenerManager.AddJobListener(new JobListener());//Job監聽器 scheduler.ListenerManager.AddTriggerListener(new TriggerListener());//Trigger監聽器 scheduler.ListenerManager.AddSchedulerListener(new SchedulerListener());//Scheduler監聽器 //IJob IJobDetail jobDetail = JobBuilder.Create<QuartzJobDemo01>() .WithIdentity("JobName", "Group01") //唯一標識 .WithDescription("這裏是描述......") //信息描述 .StoreDurably(true) //孤立存儲 .RequestRecovery(true) //請求恢復,指應用崩潰後再次啓動,會重新執行該作業 .Build(); //IJob設置參數 jobDetail.JobDataMap.Add("UserName1", "張三"); jobDetail.JobDataMap.Add("Weight", 100); jobDetail.JobDataMap.Add("time", DateTime.Now); //ITrigger ITrigger trigger = TriggerBuilder.Create() .WithIdentity("TriggerName", "Group01") //.StartAt(new DateTimeOffset()) //從某時間段開始執行 //.StartNow() //從現在開始 //鏈式策略 //.WithSimpleSchedule(p => //{ // p.WithIntervalInSeconds(5) //5秒執行一次,(WithIntervalInHours小時,WithIntervalInMinutes分鐘) // //.WithRepeatCount(3) //執行3次 // .RepeatForever(); //一直執行 //正則表達式策略 .WithCronSchedule("0/5 * * * * ? ") //每5秒執行一次:https://cron.ciding.cc/在線正則解析 .Build(); // ITrigger設置參數 trigger.JobDataMap.Add("Age", 18); //添加調度 await scheduler.ScheduleJob(jobDetail, trigger); } } }
QuartzJobDemo01.cs
using Quartz; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace QuartzScheduler.Job { /// <summary> /// 任務01 /// </summary> [PersistJobDataAfterExecution]//執行後保留作業數據 [DisallowConcurrentExecution]//確保上次執行完成後才能執行這次 public class QuartzJobDemo01 : IJob { public QuartzJobDemo01() { Console.WriteLine("--QuartzJobDemo01被構造了-"); } public async Task Execute(IJobExecutionContext context) { await Task.Factory.StartNew(() => { string? username01= context.JobDetail.JobDataMap.GetString("UserName1"); int? weight = context.JobDetail.JobDataMap.GetInt("Weight"); string? time = context.JobDetail.JobDataMap.GetDateTime("time").ToString(); int? age = context.Trigger.JobDataMap.GetInt("Age"); Console.WriteLine("--------------------------------------"); Console.WriteLine($"Hello,這是QuartzJobDemo01..........."); Console.WriteLine($"傳過來的參數UserName01:{username01}"); Console.WriteLine($"傳過來的參數Weight:{weight}"); Console.WriteLine($"傳過來的參數time:{time}"); Console.WriteLine($"傳過來的參數Age:{age}"); context.JobDetail.JobDataMap.Put("Weight", weight + 1);//保留作業數據測試 Console.WriteLine("--------------------------------------"); }); } } }
JobListener.cs
using Quartz; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace QuartzScheduler.Listener { /// <summary> /// Job監聽器 /// </summary> public class JobListener : IJobListener { public string Name => "JobListener的名稱"; /// <summary> /// 任務中斷後執行 /// </summary> /// <param name="context"></param> /// <param name="cancellationToken"></param> /// <returns></returns> /// <exception cref="NotImplementedException"></exception> public async Task JobExecutionVetoed(IJobExecutionContext context, CancellationToken cancellationToken = default) { await Task.Run(() => Console.WriteLine("任務中斷後執行...........")); } /// <summary> /// 執行前觸發 /// </summary> /// <param name="context"></param> /// <param name="cancellationToken"></param> /// <returns></returns> /// <exception cref="NotImplementedException"></exception> public async Task JobToBeExecuted(IJobExecutionContext context, CancellationToken cancellationToken = default) { await Task.Run(() => Console.WriteLine("執行前觸發...........")); } /// <summary> /// 執行後會觸發 /// </summary> /// <param name="context"></param> /// <param name="jobException"></param> /// <param name="cancellationToken"></param> /// <returns></returns> /// <exception cref="NotImplementedException"></exception> public async Task JobWasExecuted(IJobExecutionContext context, JobExecutionException? jobException, CancellationToken cancellationToken = default) { await Task.Run(() =>Console.WriteLine("執行後會觸發...........")); } } }
TriggerListener.cs
using Quartz; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace QuartzScheduler.Listener { /// <summary> /// Trigger監聽器 /// </summary> public class TriggerListener : ITriggerListener { public string Name => "TriggerListener名稱"; /// <summary> /// 在JobListener觸發完再觸發 /// </summary> /// <param name="trigger"></param> /// <param name="context"></param> /// <param name="triggerInstructionCode"></param> /// <param name="cancellationToken"></param> /// <returns></returns> /// <exception cref="NotImplementedException"></exception> public async Task TriggerComplete(ITrigger trigger, IJobExecutionContext context, SchedulerInstruction triggerInstructionCode, CancellationToken cancellationToken = default) { await Task.Run(() => Console.WriteLine("TriggerListener---->TriggerComplete,在JobListener觸發完再觸發...........")); Console.WriteLine(""); Console.WriteLine(""); Console.WriteLine(""); } /// <summary> /// 在JobListener觸發前觸發 /// </summary> /// <param name="trigger"></param> /// <param name="context"></param> /// <param name="cancellationToken"></param> /// <returns></returns> /// <exception cref="NotImplementedException"></exception> public async Task TriggerFired(ITrigger trigger, IJobExecutionContext context, CancellationToken cancellationToken = default) { await Task.Run(() => Console.WriteLine("TriggerListener---->TriggerFired,在JobListener觸發前觸發 ...........")); } public async Task TriggerMisfired(ITrigger trigger, CancellationToken cancellationToken = default) { await Task.Run(() => Console.WriteLine("TriggerListener---->TriggerMisfired ...........")); } /// <summary> /// 返回true取消執行,false繼續執行 /// </summary> /// <param name="trigger"></param> /// <param name="context"></param> /// <param name="cancellationToken"></param> /// <returns></returns> /// <exception cref="NotImplementedException"></exception> public async Task<bool> VetoJobExecution(ITrigger trigger, IJobExecutionContext context, CancellationToken cancellationToken = default) { //返回true 只會執行TriggerFired方法 return await Task.Run(() => { return false; }); } } }
SchedulerListener.cs
using Quartz; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace QuartzScheduler.Listener { /// <summary> /// Scheduler監聽器 https://www.quartz-scheduler.net/documentation/quartz-3.x/tutorial/scheduler-listeners.html /// </summary> public class SchedulerListener : ISchedulerListener { /// <summary> /// Job被添加時 /// </summary> /// <param name="jobDetail"></param> /// <param name="cancellationToken"></param> /// <returns></returns> /// <exception cref="NotImplementedException"></exception> public async Task JobAdded(IJobDetail jobDetail, CancellationToken cancellationToken = default) { await Task.Run(() => Console.WriteLine($"****** JobAdded ******{jobDetail.Key.Name}")); } public async Task JobDeleted(JobKey jobKey, CancellationToken cancellationToken = default) { await Task.Run(() => Console.WriteLine($"****** JobDeleted ******{jobKey.Name}")); } public async Task JobInterrupted(JobKey jobKey, CancellationToken cancellationToken = default) { await Task.Run(() => Console.WriteLine($"****** JobInterrupted ******{jobKey.Name}")); } public async Task JobPaused(JobKey jobKey, CancellationToken cancellationToken = default) { await Task.Run(() => Console.WriteLine($"****** JobPaused ******{jobKey.Name}")); } public async Task JobResumed(JobKey jobKey, CancellationToken cancellationToken = default) { await Task.Run(() => Console.WriteLine($"****** JobResumed ******{jobKey.Name}")); } public async Task JobScheduled(ITrigger trigger, CancellationToken cancellationToken = default) { await Task.Run(() => Console.WriteLine($"****** JobScheduled ******{trigger.Key.Name}")); } public async Task JobsPaused(string jobGroup, CancellationToken cancellationToken = default) { await Task.Run(() => Console.WriteLine($"****** JobsPaused ******{jobGroup}")); } public async Task JobsResumed(string jobGroup, CancellationToken cancellationToken = default) { await Task.Run(() => Console.WriteLine($"****** JobsResumed ******{jobGroup}")); } public async Task JobUnscheduled(TriggerKey triggerKey, CancellationToken cancellationToken = default) { await Task.Run(() => Console.WriteLine($"****** JobUnscheduled ******{triggerKey.Name}")); } public async Task SchedulerError(string msg, SchedulerException cause, CancellationToken cancellationToken = default) { await Task.Run(() => Console.WriteLine($"****** SchedulerError ******{msg}")); } public async Task SchedulerInStandbyMode(CancellationToken cancellationToken = default) { await Task.Run(() => Console.WriteLine($"****** SchedulerInStandbyMode ******")); } public async Task SchedulerShutdown(CancellationToken cancellationToken = default) { await Task.Run(() => Console.WriteLine($"****** SchedulerShutdown ******")); } public async Task SchedulerShuttingdown(CancellationToken cancellationToken = default) { await Task.Run(() => Console.WriteLine($"****** SchedulerShuttingdown ******")); } public async Task SchedulerStarted(CancellationToken cancellationToken = default) { await Task.Run(() => Console.WriteLine($"****** SchedulerStarted ******")); } public async Task SchedulerStarting(CancellationToken cancellationToken = default) { await Task.Run(() => Console.WriteLine($"****** SchedulerStarting ******")); } public async Task SchedulingDataCleared(CancellationToken cancellationToken = default) { await Task.Run(() => Console.WriteLine($"****** SchedulingDataCleared ******")); } public async Task TriggerFinalized(ITrigger trigger, CancellationToken cancellationToken = default) { await Task.Run(() => Console.WriteLine($"****** TriggerFinalized ******{trigger.Key.Name}")); } public async Task TriggerPaused(TriggerKey triggerKey, CancellationToken cancellationToken = default) { await Task.Run(() => Console.WriteLine($"****** TriggerPaused ******{triggerKey.Name}")); } public async Task TriggerResumed(TriggerKey triggerKey, CancellationToken cancellationToken = default) { await Task.Run(() => Console.WriteLine($"****** TriggerResumed ******{triggerKey.Name}")); } public async Task TriggersPaused(string? triggerGroup, CancellationToken cancellationToken = default) { await Task.Run(() => Console.WriteLine($"****** TriggersPaused ******{triggerGroup}")); } public async Task TriggersResumed(string? triggerGroup, CancellationToken cancellationToken = default) { await Task.Run(() => Console.WriteLine($"****** TriggersResumed ******{triggerGroup}")); } } }
調用
internal class Program { static void Main(string[] args) { MyScheduler.SchedulerAction().GetAwaiter().GetResult(); Console.Read(); } }