Quartz.NET快速入門指南
最近工作中遇到了Quartz.net,為了更好的理解公司程式碼的寫法,於是就好好的研究了一下這個東西,確實是好東西,既然是好東西,我就拿出來分享一下。萬丈高樓平地起,我們也是從入門開始吧。
歡迎使用Quartz.NET快速入門指南。 在閱讀本指南時,希望看到以下詳細資訊:
1、下載Quartz.NET
2、安裝Quartz.NET
3、根據您自己的特定需求配置Quartz
4、開始示例應用程式
一、下載並安裝
您可以直接下載zip檔案或使用NuGet包來獲取檔案。但是二者是有區別的,NuGet包只包含執行Quartz.NET所需的二進位制檔案,Zip檔案就不一樣了,包含原始碼、示例和Quartz.NET伺服器示例應用程式。
Zip檔案
簡短版本:如果你成功下載了Quartz.NET壓縮包檔案,只要將ZIP檔案解壓,從bin目錄中獲取Quartz.dll檔案,就可以開始使用它了。
Quartz核心庫是一個非常乾淨和獨立的類庫,不會強行依賴於任何的其他二進位制檔案。 如果您想使用JSON.NET的進行JSON序列化時,您可以根據需要選擇加入更多依賴項。同時您只要保證在應用程式中包含了Quartz.dll檔案就可以成功執行Quartz.NET,也會和其他的二進位制檔案相處融洽。 因此,只需將Quartz.dll檔案新增到使用它們的Visual Studio專案中就可以安全執行。 您可以從路徑bin \ your-target-framework-version \ release \ Quartz中提取的存檔中找到這些dll。
二、NuGet包
沒有比這種方法更簡單的做法了,只需啟動Visual Studio(安裝了NuGet)並從包管理器擴充套件中新增對Quartz包的引用:
1、右鍵單擊專案的“引用”(References),然後選擇“管理 NuGet 程式包(N)”(Manage NuGet Packages(N)) ...
2、從左側選擇“瀏覽or線上”類別
3、在左上方的搜尋中輸入Quartz,然後按Enter鍵
4、從搜尋結果中選擇Quartz.NET並點選安裝
5、完成!
或者使用NuGet的命令列來安裝:
Install-Package Quartz
如果要新增JSON序列化,只需以相同的方式新增Quartz.Serialization.Json包。
三、配置
這是大有點! Quartz.NET是一個支援高度可配置的庫。Quartz.NET提供三種的配置資訊的方式(不相互排斥):
1、以程式設計方式通過向排程程式工廠提供NameValueCollection引數
2、通過使用quartz-element的標準youapp.exe.config配置檔案(僅限完整的.NET框架)
3、應用程式根目錄中的quartz.config檔案(適用於.NET Core和完整的.NET Framework)
您可以在Quartz.NET zip檔案中找到所有這些替代品的樣本。
Quartz Configuration Reference中提供了可用屬性的完整文件。
為了快速啟動和執行,提供了基本的quartz.config的配置檔案看起來應該像這樣:
quartz.scheduler.instanceName = MyScheduler quartz.jobStore.type = Quartz.Simpl.RAMJobStore,Quartz quartz.threadPool.threadCount = 3
請記住在Visual Studio的檔案屬性頁上設定“複製到輸出目錄”以使值始終為“複製”。否則,如果配置不在構建目錄中,則不會看到該配置。
此配置建立的排程程式具有以下特徵:
quartz.scheduler.instanceName - 此排程程式的名稱將為“MyScheduler”。
quartz.threadPool.threadCount - 最多可同時執行3個作業。
quartz.jobStore.type - 所有Quartz的資料,例如作業和觸發器的詳細資訊,都儲存在記憶體中(而不是資料庫中)。即使你有一個數據庫並希望在Quartz中使用它,我建議你在使用資料庫開啟一個全新的維度之前讓Quartz使用RamJobStore。
實際上,如果你不想定義這些屬性,Quartz.NET會提供合理的預設值
四、先來一個簡單的例項程式
現在您已經下載並安裝了Quartz,現在是時候啟動並執行一個示例應用程式了。 以下程式碼獲取排程程式的例項,啟動它,然後將其關閉:
1using System; 2using System.Threading.Tasks; 3 4using Quartz; 5using Quartz.Impl; 6 7namespace QuartzSampleApp 8{ 9public class Program 10{ 11private static void Main(string[] args) 12{ 13// trigger async evaluation 14RunProgram().GetAwaiter().GetResult(); 15} 16 17private static async Task RunProgram() 18{ 19try 20{ 21// 從Factory獲取Scheduler例項 22NameValueCollection props = new NameValueCollection 23{ 24{ "quartz.serializer.type", "binary" } 25}; 26StdSchedulerFactory factory = new StdSchedulerFactory(props); 27IScheduler scheduler = await factory.GetScheduler(); 28 29// 並啟動它 30await scheduler.Start(); 31 32// some sleep to show what's happening 33await Task.Delay(TimeSpan.FromSeconds(10)); 34 35// 當您準備關閉程式時,最後關閉排程程式 36await scheduler.Shutdown(); 37} 38catch (SchedulerException se) 39{ 40await Console.Error.WriteLineAsync(se.ToString()); 41} 42} 43} 44}
從Quartz 3.0開始,當在scheduler.Shutdown() 之後沒有剩下的程式碼要執行時,你的應用程式將終止,因為沒有任何活動的執行緒。 如果希望在處理Task.Delay和Shutdown之後排程程式繼續執行,則應手動阻止退出應用程式。
現在執行該程式將不會顯示任何內容。 10秒後,程式將終止。 讓我們新增一些日誌記錄到控制檯。
五、增加日誌功能
LibLog可以配置為使用不同的日誌框架; 即Log4Net,NLog和Serilog。
當LibLog沒有檢測到任何其他日誌框架存在時,它將是不做任何事的。 如果您還沒有一個設定好的日誌框架,我們可以配置一個自定義的日誌記錄器提供程式,只需登入到控制檯即可顯示輸出。
1 LogProvider.SetCurrentLogProvider(new ConsoleLogProvider()); 2 3private class ConsoleLogProvider : ILogProvider 4{ 5public Logger GetLogger(string name) 6{ 7return (level, func, exception, parameters) => 8{ 9if (level >= LogLevel.Info && func != null) 10{ 11Console.WriteLine("[" + DateTime.Now.ToLongTimeString() + "] [" + level + "] " + func(), parameters); 12} 13return true; 14}; 15} 16 17public IDisposable OpenNestedContext(string message) 18{ 19throw new NotImplementedException(); 20} 21 22public IDisposable OpenMappedContext(string key, string value) 23{ 24throw new NotImplementedException(); 25} 26}
六、探索使用 Job 作業的完整過程
現在,當我們啟動應用程式時,我們應該獲得更多資訊。
[10:52:50] [Info] Using object serializer: Quartz.Simpl.BinaryObjectSerializer, Quartz [10:52:50] [Info] Initialized Scheduler Signaller of type: Quartz.Core.SchedulerSignalerImpl [10:52:50] [Info] Quartz Scheduler v.3.0.7.0 created. [10:52:50] [Info] RAMJobStore initialized. [10:52:50] [Info] Scheduler meta-data: Quartz Scheduler (v3.0.7.0) 'QuartzScheduler' with instanceId 'NON_CLUSTERED' Scheduler class: 'Quartz.Core.QuartzScheduler' - running locally. NOT STARTED. Currently in standby mode. Number of jobs executed: 0 Using thread pool 'Quartz.Simpl.DefaultThreadPool' - with 10 threads. Using job-store 'Quartz.Simpl.RAMJobStore' - which does not support persistence. and is not clustered. [10:52:50] [Info] Quartz scheduler 'QuartzScheduler' initialized [10:52:50] [Info] Quartz scheduler version: 3.0.7.0 [10:52:50] [Info] Scheduler QuartzScheduler_$_NON_CLUSTERED started.
我們需要一個簡單的測試工作來測試功能,讓我們建立HelloJob來向控制檯輸出問候語。
1public sealed class HelloJob : IJob 2{ 3public async Task Execute(IJobExecutionContext context) 4{ 5await Console.Out.WriteLineAsync("Greetings from HelloJob!"); 6} 7}
要做一些有趣的事情,您需要在Task.Delay之前的Start() 方法之後使用程式碼。
1// 定義job作業並將其繫結到HelloJob類 2IJobDetail job = JobBuilder.Create<HelloJob>() 3.WithIdentity("job1", "group1") 4.Build(); 5 6//觸發作業立即執行,然後每10秒重複一次 7ITrigger trigger = TriggerBuilder.Create() 8.WithIdentity("trigger1", "group1") 9.StartNow() 10.WithSimpleSchedule(x => x 11.WithIntervalInSeconds(10) 12.RepeatForever()) 13.Build(); 14 15//告訴 quartz 使用我們的觸發器安排作業 16await scheduler.ScheduleJob(job, trigger);
完整的控制檯應用程式現在看起來像這樣
1using System; 2using System.Threading.Tasks; 3 4using Quartz; 5using Quartz.Impl; 6using Quartz.Logging; 7 8namespace QuartzSampleApp 9{ 10public class Program 11{ 12private static void Main(string[] args) 13{ 14LogProvider.SetCurrentLogProvider(new ConsoleLogProvider()); 15 16RunProgram().GetAwaiter().GetResult(); 17 18Console.WriteLine("Press any key to close the application"); 19Console.ReadKey(); 20} 21 22private static async Task RunProgram() 23{ 24try 25{ 26// Grab the Scheduler instance from the Factory 27NameValueCollection props = new NameValueCollection 28{ 29{ "quartz.serializer.type", "binary" } 30}; 31StdSchedulerFactory factory = new StdSchedulerFactory(props); 32IScheduler scheduler = await factory.GetScheduler(); 33 34// and start it off 35await scheduler.Start(); 36 37// define the job and tie it to our HelloJob class 38IJobDetail job = JobBuilder.Create<HelloJob>() 39.WithIdentity("job1", "group1") 40.Build(); 41 42// Trigger the job to run now, and then repeat every 10 seconds 43ITrigger trigger = TriggerBuilder.Create() 44.WithIdentity("trigger1", "group1") 45.StartNow() 46.WithSimpleSchedule(x => x 47.WithIntervalInSeconds(10) 48.RepeatForever()) 49.Build(); 50 51// Tell quartz to schedule the job using our trigger 52await scheduler.ScheduleJob(job, trigger); 53 54// some sleep to show what's happening 55await Task.Delay(TimeSpan.FromSeconds(60)); 56 57// and last shut down the scheduler when you are ready to close your program 58await scheduler.Shutdown(); 59} 60catch (SchedulerException se) 61{ 62Console.WriteLine(se); 63} 64} 65 66// simple log provider to get something to the console 67private class ConsoleLogProvider : ILogProvider 68{ 69public Logger GetLogger(string name) 70{ 71return (level, func, exception, parameters) => 72{ 73if (level >= LogLevel.Info && func != null) 74{ 75Console.WriteLine("[" + DateTime.Now.ToLongTimeString() + "] [" + level + "] " + func(), parameters); 76} 77return true; 78}; 79} 80 81public IDisposable OpenNestedContext(string message) 82{ 83throw new NotImplementedException(); 84} 85 86public IDisposable OpenMappedContext(string key, string value) 87{ 88throw new NotImplementedException(); 89} 90} 91} 92 93public class HelloJob : IJob 94{ 95public async Task Execute(IJobExecutionContext context) 96{ 97await Console.Out.WriteLineAsync("Greetings from HelloJob!"); 98} 99} 100}
現在去探索Quartz.NET吧! 您可以繼續閱讀本教程。原文地址如下:ofollow,noindex">https://www.quartz-scheduler.net/documentation/quartz-3.x/quick-start.html