1 什麼是Quartz.NET?
Docker是一個功能齊全的開源作業排程系統,可以與幾乎任何其他軟體系統整合或一起使用。
2 為什麼需要Quartz.NET?.NET Framework透過System.Timers.Timer類具有“內建”計時器功能-為什麼有人使用Quartz而不是這些標準功能?
原因有很多!這裡有一些:
計時器沒有永續性機制。計時器的時間安排不靈活(只能設定開始時間和重複間隔,沒有基於日期,一天中的時間等資訊)。計時器不使用執行緒池(每個計時器一個執行緒)計時器沒有真正的管理方案-您必須編寫自己的機制以能夠按名稱記住,組織和恢復任務等。3 如何使用Quartz.NET?首先,安裝Quartz
Quartz
然後,定義一個任務類
using System;using System.Threading.Tasks;namespace Quartz.ConsoleApp01{ public class HelloJob : IJob { public Task Execute(IJobExecutionContext context) { Console.WriteLine("Hello "+DateTime.Now); return Task.CompletedTask; } }}
最後,例項化並啟動排程程式,並排程要執行的作業:
using Quartz.Impl;using System;using System.Threading.Tasks;namespace Quartz.ConsoleApp01{ class Program { static async Task Main(string[] args) { Console.WriteLine("開始排程!"); //1、建立一個排程 var factory = new StdSchedulerFactory(); var scheduler = await factory.GetScheduler(); await scheduler.Start(); //2、建立一個任務 var job = JobBuilder.Create<HelloJob>() .WithIdentity("job1", "group1") .Build(); //3、建立一個觸發器 var trigger = TriggerBuilder.Create() .WithIdentity("trigger1", "group1") .WithCronSchedule("0/5 * * * * ?") //5秒執行一次 .Build(); await scheduler.ScheduleJob(job, trigger); Console.ReadKey(); } }}
我們來看一下輸出結果:
開始排程!Hello 2021/1/19 14:37:40Hello 2021/1/19 14:37:45Hello 2021/1/19 14:37:50Hello 2021/1/19 14:37:55
3 使用配置檔案方式使用Quartz.NET?
首先,安裝Quartz,Quartz.Plugins
QuartzQuartz.Plugins
然後,定義一個任務類
using System;using System.Threading.Tasks;namespace Quartz.ConsoleApp02{ public class HelloJob : IJob { public Task Execute(IJobExecutionContext context) { Console.WriteLine("Hello " + DateTime.Now); return Task.CompletedTask; } }}
接著,配置quartz_jobs.xml檔案
最後,例項化並啟動排程程式:
using Quartz.Impl;using System;using System.Collections.Specialized;using System.Threading.Tasks;namespace Quartz.ConsoleApp02{ class Program { static async Task Main(string[] args) { Console.WriteLine("開始排程!"); //1、首先,我們必須獲得對排程程式的引用 var properties = new NameValueCollection { ["quartz.scheduler.instanceName"] = "XmlConfiguredInstance", ["quartz.threadPool.type"] = "Quartz.Simpl.SimpleThreadPool, Quartz", ["quartz.threadPool.threadCount"] = "5", ["quartz.plugin.xml.type"] = "Quartz.Plugin.Xml.XMLSchedulingDataProcessorPlugin, Quartz.Plugins", ["quartz.plugin.xml.fileNames"] = "~/quartz_jobs.xml", // this is the default ["quartz.plugin.xml.FailOnFileNotFound"] = "true", // this is not the default ["quartz.plugin.xml.failOnSchedulingError"] = "true" }; //2、建立一個排程 var factory = new StdSchedulerFactory(properties); var scheduler = await factory.GetScheduler(); await scheduler.Start(); Console.ReadKey(); } }}
4 Cron表示式4.1 介紹cron是已存在很長時間的UNIX工具,因此其排程功能強大且經過驗證。cron表示式是由7段構成:秒 分 時 日 月 星期 年(可選)
"*" 用於選擇欄位中的所有值,例如,在分鐘欄位中表示“每分鐘”。"?" 在需要在允許使用字元的兩個欄位之一中指定某些內容而在另一個不允許使用的欄位中指定內容時很有用。例如,如果我希望觸發器在每月的某個特定日期(例如10號)觸發,但不在乎是星期幾,則將其10輸入“月日”欄位,以及?“星期幾”欄位中。"-" 用於指定範圍。例如,10-12在小時欄位中表示“小時10、11和12”。"," 用於指定其他值。例如,MON,WED,FRI在“星期幾”欄位中表示“星期一,星期三和星期五的日子”。"/" 用於指定增量。例如,0/15在秒欄位中表示“秒0、15、30和45”。和5/15在秒欄位的意思是“秒5,20,35和50”。"L" 在允許使用的兩個欄位中都有不同的含義。例如,“L月日”欄位中的值表示“月的最後一天”"W" 用於指定最接近給定日期的工作日(星期一至星期五)。例如,如果您要指定“15W月日”欄位的值,則含義是:“離月15日最近的工作日”。"#" 用於指定每月的“第n個” XXX天。例如,“6#3星期幾”欄位中的值表示“每月的第三個星期五”(第6天=星期五,“#3” =每月的第三個星期五)。4.2 例子表達含義0 0 12 * * ?每天中午12點(中午)觸發0 15 10 ? * *每天上午10:15觸發0 15 10 * * ?每天上午10:15觸發0 15 10 * * ? *每天上午10:15觸發0 15 10 * * ? 20052005年期間,每天上午10:15觸發0 * 14 * * ?每天從下午2點開始,直到下午2:59結束,每分鐘觸發一次0 0/5 14 * * ?每天從下午2點開始,直到下午2:55,每5分鐘觸發一次0 0/5 14,18 * * ?每天從下午2點開始到下午2:55結束,每5分鐘觸發一次,並且每天下午6點開始到下午6:55結束,每5分鐘觸發一次0 0-5 14 * * ?每天從下午2點開始,直到下午2:05結束,每分鐘觸發一次0 10,44 14 ? 3 WED3月的每個星期三下午2:10和2:44 pm觸發。0 15 10 ? * MON-FRI每個星期一,星期二,星期三,星期四和星期五的上午10:15觸發0 15 10 15 * ?每個月的15日上午10:15觸發0 15 10 L * ?每個月的最後一天上午10:15觸發0 15 10 L-2 * ?每個月的倒數第二個上午10:15觸發0 15 10 ? * 6L每個月的最後一個星期五上午10:15觸發0 15 10 ? * 6L每個月的最後一個星期五上午10:15觸發0 15 10 ? * 6L 2002-2005在2002、2003、2004和2005年的每個月的最後一個星期五上午10:15觸發0 15 10 ? * 6#3每個月的第三個星期五上午10:15觸發0 0 12 1/5 * ?從每月的第一天開始,每月每5天在中午12點(中午)觸發。0 11 11 11 11 ?每年11月11日上午11:11觸發。