最近因為項目需要用到了Quartz,下面簡單記錄一下。
一、首先需要安裝Quartz。
二、定義一個執行的Job類,實現IJob接口,接口有一個方法Execute,用來執行定時任務的實現內容。
public class HelloJob : IJob { public async Task Execute(IJobExecutionContext context) { Console.WriteLine("作業執行!"); } }
三、定時觸發,根據設定的時間間隔觸發。
//從工廠中獲取一個調度器實例化 IScheduler scheduler = await StdSchedulerFactory.GetDefaultScheduler(); await scheduler.Start(); //開啟調度器 //==========例子1(簡單使用)=========== IJobDetail job1 = JobBuilder.Create<HelloJob>() //創建一個作業 .WithIdentity("job", "group1") .Build(); ITrigger trigger1 = TriggerBuilder.Create() .WithIdentity("trigger", "group1") .StartNow() //現在開始 .WithSimpleSchedule(x => x //觸發時間,5秒一次。 .WithIntervalInSeconds(5) .RepeatForever()) //不間斷重復執行 .Build(); await scheduler.ScheduleJob(job1, trigger1); //把作業,觸發器加入調度器。
四、僅觸發一次,定時器在設定時間內,只觸發一次。
IScheduler scheduler = await StdSchedulerFactory.GetDefaultScheduler(); IJobDetail job = JobBuilder.Create<HelloJob>() //創建一個作業 .WithIdentity("job3", "group3") .Build(); ITrigger trigger = trigger = (ISimpleTrigger)TriggerBuilder.Create() .WithIdentity("trigger3", "group3") .StartAt(DateBuilder.FutureDate(1, IntervalUnit.Second)) //使用DateBuilder將來創建一個時間日期 .ForJob(job) //通過JobKey識別作業 .Build(); await scheduler.ScheduleJob(job,trigger); await scheduler.Start();
五、移除定時任務
調用公共方法,實現定時任務移除
JobKey JKey = new JobKey("job", "group1"); TriggerKey TKey = new TriggerKey("trigger", "group1"); await QuartzHelper.RemoveJob(JKey, TKey);
封裝了一個定時器的公共類,方便程序復用。
public static class QuartzHelper { public static async Task RemoveJob(JobKey jobKey, TriggerKey triggerKey) { try { var scheduler = await TaskDeadLineEndJob.GetSchedulerAsync(); var state = await scheduler.GetTriggerState(triggerKey); if (state == TriggerState.None) { return; } await scheduler.PauseTrigger(triggerKey);// 停止觸發器 await scheduler.UnscheduleJob(triggerKey);// 移除觸發器 await scheduler.DeleteJob(jobKey);// 刪除任務 } catch (Exception) { throw; } } }
定義一個工廠類,用來保證定時任務是唯一的,如果每次都new一個新實例,后面可能會出問題。
public class TaskDeadLineEndJob { private static IScheduler scheduler; private static Task<IScheduler> TaskScheduler; private static readonly object padlock = new object(); public static async Task<IScheduler> GetSchedulerAsync() { lock (padlock) { // 如果類的實例不存在則創建,否則直接返回 if (scheduler == null) { ISchedulerFactory schedf = new StdSchedulerFactory(); TaskScheduler = schedf.GetScheduler(); } else { return scheduler; } } return await TaskScheduler; } public TaskDeadLineEndJob() { try { Task.Run(async () => { // 開啟調度器 scheduler = await GetSchedulerAsync(); await scheduler.Start(); }); } catch (Exception) { throw; } } }