Quartz框架的一些基礎概念解釋:
Scheduler 作業調度器。
IJob 作業接口,繼承並實現Execute, 編寫執行的具體作業邏輯。
JobBuilder 根據設置,生成一個詳細作業信息(JobDetail)。
TriggerBuilder 根據規則,生產對應的Trigger
時間表達式參考博客:https://www.cnblogs.com/GarfieldTom/p/3746290.html
一、創建項目
二、安裝Quartz插件
三、創建QuartZ作業類
四、創建任務過程
1、控制檯程序 (Program)
1 static void Main(string[] args) 2 { 3 Console.WriteLine("開始了:Hello Quart"); 4 Console.WriteLine("---------------------------------------------"); 5 QuartzExtensions.QuartzStart("Y").Wait(); 6 Console.WriteLine("系統進入Pending狀態。輸入 exit 退出....."); 7 Console.WriteLine("---------------------------------------------"); 8 while (true) 9 { 10 if (Console.ReadLine() == "exit") 11 break; 12 } 13 }
2、Quartz擴展創建任務(QuartzExtensions)
1 using Quartz; 2 using Quartz.Impl; 3 using System; 4 using System.Collections.Specialized; 5 using System.Threading.Tasks; 6 7 namespace CoreQuartDemo 8 { 9 public class QuartzExtensions 10 { 11 /// <summary> 12 /// Quart啓動 13 /// </summary> 14 /// <param name="isImmediately">是否立即執行,此處只用於測試(默認N:否,Y:是)</param> 15 /// <returns></returns> 16 public static async Task QuartzStart(string isImmediately = "N") 17 { 18 try 19 { 20 // 從工廠中獲取調度程序實例 21 NameValueCollection props = new NameValueCollection 22 { 23 { "quartz.serializer.type", "binary" } 24 }; 25 StdSchedulerFactory factory = new StdSchedulerFactory(props); 26 IScheduler scheduler = await factory.GetScheduler(); 27 // 開啓調度器 28 await scheduler.Start(); 29 if (isImmediately == "Y") 30 { 31 /**動態同步信息,每天一次(可以根據自己需求設置時間)**/ 32 IJobDetail job2; 33 ITrigger trigger2; 34 int[] len = { 1, 2, 3, 4, 5 }; 35 for (int i = 1; i <= len.Length; i++) 36 { 37 string name = Guid.NewGuid().ToString("N") + i; 38 string group = Guid.NewGuid().ToString("N") + "group" + i; 39 //綁定任務 40 job2 = JobBuilder.Create<QuartzJob>() 41 .WithIdentity(name, group) 42 .Build(); 43 job2.JobDataMap.Put("param", "自定義執行參數" + i); 44 45 //創建執行時間 46 trigger2 = TriggerBuilder.Create() 47 .WithIdentity($"" + name + ".trigger", group + "1") 48 .StartNow() 49 .WithSchedule(CronScheduleBuilder.DailyAtHourAndMinute(DateTime.Now.Hour, DateTime.Now.AddMinutes(i).Minute))//隔幾分鐘執行一次 50 .Build(); 51 //創建任務 52 scheduler.ScheduleJob(job2, trigger2).Wait();//作業,觸發器加入調度器。異步執行 53 } 54 } 55 else 56 { 57 /**定時同步信息,每天重複一次,無限循環**/ 58 // 定義同步信息工作,並將其綁定到我們的IJob實現類 59 IJobDetail job = JobBuilder.Create<QuartzJob>() 60 .WithIdentity("QuartzJob", "QuartzJobGroup") 61 .Build(); 62 job.JobDataMap.Put("param", "定期執行參數1"); 63 // 觸發作業 64 ITrigger trigger = TriggerBuilder.Create() 65 .WithIdentity("QuartzJobtRigger", "QuartzJobGroup") 66 .StartNow() 67 .WithSchedule(CronScheduleBuilder.DailyAtHourAndMinute(11, 9))//24小時制 68 .Build(); 69 await scheduler.ScheduleJob(job, trigger); 70 71 // 定義獲取信息工作,並將其綁定到我們的IJob實現類 72 IJobDetail job1 = JobBuilder.Create<QuartzJob>() 73 .WithIdentity("QuartzJob1", "QuartzJobGroup1") 74 .Build(); 75 job.JobDataMap.Put("param", "定期執行參數2"); 76 // 觸發作業 77 ITrigger trigger1 = TriggerBuilder.Create() 78 .WithIdentity("QuartzJobtRigger1", "QuartzJobGroup1") 79 .StartNow() 80 .WithSchedule(CronScheduleBuilder.DailyAtHourAndMinute(11, 10))//24小時制 81 .Build(); 82 await scheduler.ScheduleJob(job1, trigger1); 83 } 84 } 85 catch (System.Exception) 86 { 87 88 throw; 89 } 90 } 91 } 92 }
3、作業接口(QuartzJob)
1 using Quartz; 2 using System; 3 using System.Threading.Tasks; 4 5 namespace CoreQuartDemo 6 { 7 /// <summary> 8 /// 任務類,繼承Quartz中IJob接口,創建任務 9 /// </summary> 10 public class QuartzJob : IJob 11 { 12 public Task Execute(IJobExecutionContext context) 13 { 14 string param = context.JobDetail.JobDataMap.GetString("param"); 15 try 16 { 17 Console.Write("執行時間" + DateTime.Now + "結果:+" + param + "\n"); 18 } 19 catch (Exception) 20 { 21 Console.Write("catch異常執行時間" + DateTime.Now + "結果:+" + param + "\n"); 22 throw; 23 } 24 25 return Task.CompletedTask; 26 } 27 } 28 }
定期執行結果:
自定義執行