1. 程式人生 > >Quartz.NET快速入門指南

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,現在是時候啟動並執行一個示例應用程式了。 以下程式碼獲取排程程式的例項,啟動它,然後將其關閉:

 1     using System;
 2     using System.Threading.Tasks;
 3 
 4     using Quartz;
 5     using Quartz.Impl;
 6 
 7     namespace QuartzSampleApp
 8     {
 9         public class Program
10         {
11             private static void Main(string[] args)
12             {
13                 // trigger async evaluation
14                 RunProgram().GetAwaiter().GetResult();
15             }
16 
17             private static async Task RunProgram()
18             {
19                 try
20                 {
21                     // 從Factory獲取Scheduler例項
22                     NameValueCollection props = new NameValueCollection
23                     {
24                         { "quartz.serializer.type", "binary" }
25                     };
26                     StdSchedulerFactory factory = new StdSchedulerFactory(props);
27                     IScheduler scheduler = await factory.GetScheduler();
28 
29                     // 並啟動它
30                     await scheduler.Start();
31 
32                     // some sleep to show what's happening
33                     await Task.Delay(TimeSpan.FromSeconds(10));
34 
35                     // 當您準備關閉程式時,最後關閉排程程式
36                     await scheduler.Shutdown();
37                 }
38                 catch (SchedulerException se)
39                 {
40                     await 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 
 3     private class ConsoleLogProvider : ILogProvider
 4     {
 5         public Logger GetLogger(string name)
 6         {
 7             return (level, func, exception, parameters) =>
 8             {
 9                 if (level >= LogLevel.Info && func != null)
10                 {
11                     Console.WriteLine("[" + DateTime.Now.ToLongTimeString() + "] [" + level + "] " + func(), parameters);
12                 }
13                 return true;
14             };
15         }
16 
17         public IDisposable OpenNestedContext(string message)
18         {
19             throw new NotImplementedException();
20         }
21 
22         public IDisposable OpenMappedContext(string key, string value)
23         {
24             throw 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來向控制檯輸出問候語。

1     public sealed class HelloJob : IJob
2     {
3         public async Task Execute(IJobExecutionContext context)
4         {
5             await Console.Out.WriteLineAsync("Greetings from HelloJob!");
6         }
7     }

    要做一些有趣的事情,您需要在Task.Delay之前的Start() 方法之後使用程式碼。

 1     // 定義job作業並將其繫結到HelloJob類
 2     IJobDetail job = JobBuilder.Create<HelloJob>()
 3     .WithIdentity("job1", "group1")
 4     .Build();
 5 
 6     //觸發作業立即執行,然後每10秒重複一次
 7     ITrigger trigger = TriggerBuilder.Create()
 8     .WithIdentity("trigger1", "group1")
 9     .StartNow()
10     .WithSimpleSchedule(x => x
11         .WithIntervalInSeconds(10)
12         .RepeatForever())
13     .Build();
14 
15     //告訴 quartz 使用我們的觸發器安排作業
16     await scheduler.ScheduleJob(job, trigger);


    完整的控制檯應用程式現在看起來像這樣

  1     using System;
  2     using System.Threading.Tasks;
  3 
  4     using Quartz;
  5     using Quartz.Impl;
  6     using Quartz.Logging;
  7 
  8     namespace QuartzSampleApp
  9     {
 10         public class Program
 11         {
 12             private static void Main(string[] args)
 13             {
 14                 LogProvider.SetCurrentLogProvider(new ConsoleLogProvider());
 15 
 16                 RunProgram().GetAwaiter().GetResult();
 17 
 18                 Console.WriteLine("Press any key to close the application");
 19                 Console.ReadKey();
 20             }
 21 
 22             private static async Task RunProgram()
 23             {
 24                 try
 25                 {
 26                     // Grab the Scheduler instance from the Factory
 27                     NameValueCollection props = new NameValueCollection
 28                     {
 29                         { "quartz.serializer.type", "binary" }
 30                     };
 31                     StdSchedulerFactory factory = new StdSchedulerFactory(props);
 32                     IScheduler scheduler = await factory.GetScheduler();
 33 
 34                     // and start it off
 35                     await scheduler.Start();
 36 
 37                     // define the job and tie it to our HelloJob class
 38                     IJobDetail job = JobBuilder.Create<HelloJob>()
 39                         .WithIdentity("job1", "group1")
 40                         .Build();
 41 
 42                     // Trigger the job to run now, and then repeat every 10 seconds
 43                     ITrigger 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
 52                     await scheduler.ScheduleJob(job, trigger);
 53 
 54                     // some sleep to show what's happening
 55                     await Task.Delay(TimeSpan.FromSeconds(60));
 56 
 57                     // and last shut down the scheduler when you are ready to close your program
 58                     await scheduler.Shutdown();
 59                 }
 60                 catch (SchedulerException se)
 61                 {
 62                     Console.WriteLine(se);
 63                 }
 64             }
 65 
 66             // simple log provider to get something to the console
 67             private class ConsoleLogProvider : ILogProvider
 68             {
 69                 public Logger GetLogger(string name)
 70                 {
 71                     return (level, func, exception, parameters) =>
 72                     {
 73                         if (level >= LogLevel.Info && func != null)
 74                         {
 75                             Console.WriteLine("[" + DateTime.Now.ToLongTimeString() + "] [" + level + "] " + func(), parameters);
 76                         }
 77                         return true;
 78                     };
 79                 }
 80 
 81                 public IDisposable OpenNestedContext(string message)
 82                 {
 83                     throw new NotImplementedException();
 84                 }
 85 
 86                 public IDisposable OpenMappedContext(string key, string value)
 87                 {
 88                     throw new NotImplementedException();
 89                 }
 90             }
 91         }
 92 
 93         public class HelloJob : IJob
 94         {
 95             public async Task Execute(IJobExecutionContext context)
 96             {
 97                 await Console.Out.WriteLineAsync("Greetings from HelloJob!");
 98             }
 99         }
100     }


    現在去探索Quartz.NET吧! 您可以繼續閱讀本教程。原文地址如下:https://www.quartz-scheduler.net/documentation/quartz-3.x/quick-start.html