1. 程式人生 > >在.NET Core 中使用Quartz.NET

在.NET Core 中使用Quartz.NET

Quartz.NET是功能齊全的開源作業排程系統,可用於最小的應用程式到大型企業系統。 Quartz.NET具有三個主要概念: - job:執行的後臺任務 - trigger:控制後臺任務執行的觸發器。 - scheduler:協調job和trigger ![](https://blog-1259586045.cos.ap-shanghai.myqcloud.com/clipboard_20210123_095408.png) ASP.NET Core通過託管服務對執行“後臺任務”具有良好的支援,託管服務在ASP.NET Core應用程式啟動時啟動,並在應用程式生存期內在後臺執行,Quartz.NET版本3.2.0通過Quartz.Extensions.Hosting包引入了對該模式的直接支援,Quartz.Extensions.Hosting可以與ASP.NET Core應用程式一起使用,也可以與基於“通用主機”的工作程式服務一起使用。 雖然.NET Core可以建立“定時”後臺服務(例如,每10分鐘執行一次任務),但Quartz.NET提供了更為強大的解決方案, 通過使用Cron表示式,您可以確保任務在特定時間(例如,凌晨2:30)執行,或僅在特定的幾天執行,或這些時間的任意組合。Quartz.NET還允許您以叢集方式執行應用程式的多個例項,以便在任何時候都只能執行一個例項。 ## 安裝Quartz.NET Quartz.NET是一個.NET Standard 2.0 NuGet軟體包,所以大部分專案都是支援的,你可以執行安裝命令,`dotnet add package Quartz.Extensions.Hosting`,或者在NNuget視覺化安裝,如果檢視該專案的.csproj,應該是下邊這樣: ```csharp net5.0 dotnet-QuartzWorkerService-9D4BFFBE-BE06-4490-AE8B-8AF1466778FD ``` 安裝完成以後,這個包會自動安裝 Quartz.NET包,接下來,我們需要在我們的應用程式中註冊Quartz服務和Quartz 。 ## 新增Quartz.NET hosted service 修改Program.cs,註冊服務 ```csharp public class Program { public static void Main(string[] args) { CreateHostBuilder(args).Build().Run(); } public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args) .ConfigureServices((hostContext, services) => { // Add the required Quartz.NET services services.AddQuartz(q => { // Use a Scoped container to create jobs. I'll touch on this later q.UseMicrosoftDependencyInjectionScopedJobFactory(); }); // Add the Quartz.NET hosted service services.AddQuartzHostedService( q =>
q.WaitForJobsToComplete = true); // other config }); } ``` UseMicrosoftDependencyInjectionScopedJobFactory(),這個地方告訴Quartz.NET註冊一個IJobFactory,然後從DI容器中獲取Job,這樣也可以使用 Scoped 型別的服務。 WaitForJobsToComplete():當程式關閉時,此設定可確保Quartz.NET在退出之前等待Job正常結束。 如果現在執行您的應用程式,您將看到Quartz服務啟動,並將有很多日誌輸出到控制檯: ```csharp info: Quartz.Core.SchedulerSignalerImpl[0] Initialized Scheduler Signaller of type: Quartz.Core.SchedulerSignalerImpl info: Quartz.Core.QuartzScheduler[0] Quartz Scheduler v.3.2.3.0 created. info: Quartz.Core.QuartzScheduler[0] JobFactory set to: Quartz.Simpl.MicrosoftDependencyInjectionJobFactory info: Quartz.Simpl.RAMJobStore[0] RAMJobStore initialized. info: Quartz.Core.QuartzScheduler[0] Scheduler meta-data: Quartz Scheduler (v3.2.3.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. info: Quartz.Impl.StdSchedulerFactory[0] Quartz scheduler 'QuartzScheduler' initialized info: Quartz.Impl.StdSchedulerFactory[0] Quartz scheduler version: 3.2.3.0 info: Quartz.Core.QuartzScheduler[0] Scheduler QuartzScheduler_$_NON_CLUSTERED started. info: Microsoft.Hosting.Lifetime[0] Application started. Press Ctrl+C to shut down. ... ``` 現在,您已經將Quartz作為託管服務執行在您的應用程式中,但是現在還沒有新增需要執行的Job。 ## 建立一個IJob 這個地方我建立一個簡單的服務,並且我可以從建構函式中獲取服務。 ```csharp using Microsoft.Extensions.Logging; using Quartz; using System.Threading.Tasks; [DisallowConcurrentExecution] public class HelloWorldJob : IJob { private readonly ILogger _logger; public HelloWorldJob(ILogger logger) { _logger = logger; } public Task Execute(IJobExecutionContext context) { _logger.LogInformation("Hello world!"); return Task.CompletedTask; } } ``` 我還用[DisallowConcurrentExecution]特性,防止Quartz.NET嘗試同時運行同一個作業。 ### 設定Job 這個地方通常使用Cron表示式,來設定job的執行時間。 ```csharp public static IHostBuilder CreateHostBuilder(string[] args) => Host.CreateDefaultBuilder(args) .ConfigureServices((hostContext, services) => { services.AddQuartz(q => { q.UseMicrosoftDependencyInjectionScopedJobFactory(); // Create a "key" for the job var jobKey = new JobKey("HelloWorldJob"); // Register the job with the DI container q.AddJob(opts => opts.WithIdentity(jobKey)); // Create a trigger for the job q.AddTrigger(opts => opts .ForJob(jobKey) // link to the HelloWorldJob .WithIdentity("HelloWorldJob-trigger") // give the trigger a unique name .WithCronSchedule("0/5 * * * * ?")); // run every 5 seconds }); services.AddQuartzHostedService(q => q.WaitForJobsToComplete = true); // ... }); ``` 現在執行應用程式,您將看到和以前相同的啟動訊息,然後每隔5秒鐘就會看到HelloWorldJob寫入控制檯的資訊: ![](https://blog-1259586045.cos.ap-shanghai.myqcloud.com/clipboard_20210123_094338.png) ## 將配置提取到appsettings.json 一般情況,我們都不會把cron表示式寫死在程式碼中,一般是設定在appsettings.json中 ```csharp { "Quartz": { "HelloWorldJob": "0/5 * * * * ?" } } ``` 為了更簡單的註冊服務,這個地方我簡單做了一個封裝,這樣也更靈活。 ```csharp public static class ServiceCollectionQuartzConfiguratorExtensions { public static void AddJobAndTrigger( this IServiceCollectionQuartzConfigurator quartz, IConfiguration config) where T : IJob { // Use the name of the IJob as the appsettings.json key string jobName = typeof(T).Name; // Try and load the schedule from configuration var configKey = $"Quartz:{jobName}"; var cronSchedule = config[configKey]; // Some minor validation if (string.IsNullOrEmpty(cronSchedule)) { throw new Exception($"No Quartz.NET Cron schedule found for job in configuration at {configKey}"); } // register the job as before var jobKey = new JobKey(jobName); quartz.AddJob(opts => opts.WithIdentity(jobKey)); quartz.AddTrigger(opts => opts .ForJob(jobKey) .WithIdentity(jobName + "-trigger") .WithCronSchedule(cronSchedule)); // use the schedule from configuration } } ``` 然後修改Program.cs,然後使用擴充套件方法: ```csharp public class Program { public static void Main(string[] args) => CreateHostBuilder(args).Build().Run(); public static IHostBuilder CreateHostBuilder(string[] args) => Host.CreateDefaultBuilder(args) .ConfigureServices((hostContext, services) => { services.AddQuartz(q => { q.UseMicrosoftDependencyInjectionScopedJobFactory(); // Register the job, loading the schedule from configuration q.AddJobAndTrigger(hostContext.Configuration); }); services.AddQuartzHostedService(q => q.WaitForJobsToComplete = true); }); } ``` 再次執行該應用程式將提供相同的輸出:Job每5秒輸入一次資訊。 > 原文作者: andrewlock > 原文連結: [https://andrewlock.net/using-quartz-net-with-asp-net-core-and-worker-services/]("https://andrewlock.net/using-quartz-net-with-asp-net-core-and-worker-services/") ### 最後 歡迎掃碼關注我們的公眾號 【全球技術精選】,專注國外優秀部落格的翻譯和開源專案分享,也可以新增QQ群 897216102

相關推薦

.Net Core使用Quartz.Net

一、介紹   Quartz.Net是根據Java的Quartz用C#改寫而來,最新的版本是3.0.6,原始碼在https://github.com/quartznet/quartznet。主要作用是做一些週期性的工作,或者定時工作。比如每天凌晨2點對前一天的資料統計。 二、簡單的案例   以WebApi專案舉

在ASP.NET Core建立基於Quartz.NET託管服務輕鬆實現作業排程

在這篇文章中,我將介紹如何使用[ASP.NET Core託管服務](https://docs.microsoft.com/en-us/aspnet/core/fundamentals/host/hosted-services?view=aspnetcore-3.1)執行Quartz.NET作業。這樣的好處是我

在.NET Core 使用Quartz.NET

Quartz.NET是功能齊全的開源作業排程系統,可用於最小的應用程式到大型企業系統。 Quartz.NET具有三個主要概念: - job:執行的後臺任務 - trigger:控制後臺任務執行的觸發器。 - scheduler:協調job和trigger ![](https://blog-12595

Asp.Net CoreJson序列化處理整理

忽略 化工 res ref 工具 使用 asp.net ctr ide 一、Asp.Net Core中的Json序列化處理使用的是Newtonsoft.Json,更多參考:C# Newtonsoft.Json JsonSerializerSettings配置序列化操作,C#

asp.net core負載均衡場景下http重定向https的問題

進行 urn 循環 == 是否 美的 err add ddr 上周欣喜地發現,微軟官方終於針對 asp.net core 在使用負載均衡的情況下從 http 強制重定向至 https 的問題提供了解決方法。 app.UseForwardedHeaders(new Fo

體驗 ASP.NET Core 的多語言支持(Localization)

lan expander -c blank 根據 body esp doc input 首先在 Startup 的 ConfigureServices 中添加 AddLocalization 與 AddViewLocalization 以及配置 RequestLocaliz

在ASP.NET Core 使用Cookie中間件

新用戶 private 應該 validate ive mes esp tom 全選 http://ASP.NET Core 提供了Cookie中間件來序列化用戶主題到一個加密的Cookie中並且在後來的請求中校驗這個Cookie,再現用戶並且分配到HttpContext對

ASP.NET.Core使用AutoMapper

nvi 創建 reat fin intern stat 中間件 isa addm 首先需要在NuGet中引用AutoMapper的類庫 install-package AutoMapper install-package AutoMapper.Extens

.Net Core配置文件的解析

sof div gets path 構建 sta 讀取 創建 http 資源來自汝鵬網 使用ConfigurationBuilder讀取json配置文件 首先需要先使用Nuget安裝程序集 Install-Package Microsoft.Extensions.Conf

Net Core數據庫事務隔離詳解——以Dapper和Mysql為例

事務 ring 增刪改 tostring 測試 stc efault 多個 log Net Core中數據庫事務隔離詳解——以Dapper和Mysql為例 事務隔離級別 準備工作 Read uncommitted 讀未提交 Read committed 讀取提交內

.NET Core 的並發編程

情況下 try scan led 修改 鎖定 利用 pac 可能 今天我們購買的每臺電腦都有一個多核心的 CPU,允許它並行執行多個指令。操作系統通過將進程調度到不同的內核來發揮這個結構的優點。 然而,還可以通過異步 I/O 操作和並行處理來幫助我們提高單個應用程序的性能。

談談在.NET Core使用Redis和Memcached的序列化問題

rman -m string create 讓其 ride builder cnblogs ron 前言 在使用分布式緩存的時候,都不可避免的要做這樣一步操作,將數據序列化後再存儲到緩存中去。 序列化這一操作,或許是顯式的,或許是隱式的,這個取決於使用的package是否有

NET Core使用Redis和Memcached

前言 date toa 聯系 timespan 執行 mod init rtu 前言 在使用分布式緩存的時候,都不可避免的要做這樣一步操作,將數據序列化後再存儲到緩存中去。 序列化這一操作,或許是顯式的,或許是隱式的,這個取決於使用的package是否有幫我們做這樣一件事

IdentityServer4在Asp.Net Core的應用(一)

types eid 應用 temp ant 所有 com 好用 nts IdentityServer4是一套身份授權以及訪問控制的解決方案,專註於幫助使用.Net 技術的公司為現代應用程序建立標識和訪問控制解決方案,包括單點登錄、身份管理、授權和API安全。

IdentityServer4在Asp.Net Core的應用(二)

str discover content 用戶信息 完成 服務 resp csharp line 繼續上次授權的內容,客戶端模式後我們再說以下密碼模式,先回顧下密碼模式的流程: 我們還是使用上次的代碼,在那基礎上修改,在IdentityServer4裏面有一個Id

asp.net core遇到需要自定義數據包解密方法的時候

聲明 AD AR 但是 sof AC asp 參數聲明 request 最近將公司的項目用.netcore重寫, 服務的http外部接口部分收發消息是DES加解密的, 那麽在asp.net core mvc的action處理之前需要加入解密這個步驟. 我第一想到的是用f

.net core 使用ef 訪問mysql

www. -m ref 文檔 class .html 模式 light enc 1.參考文檔說修改項目文件添加,就得這麽做,不然會報錯 <ItemGroup> <DotNetCliToolReference Include="Micros

談談Circuit Breaker在.NET Core的簡單應用

訂單號 exe 什麽 login isolation HA 使用 doc his 前言 由於微服務的盛行,不少公司都將原來細粒度比較大的服務拆分成多個小的服務,讓每個小服務做好自己的事即可。 經過拆分之後,就避免不了服務之間的相互調用問題!如果調用沒有處理好,就有可能造成整

.NET CoreCircuit Breaker

face The please res 一段時間 故障 cte dds 理想 談談Circuit Breaker在.NET Core中的簡單應用 前言 由於微服務的盛行,不少公司都將原來細粒度比較大的服務拆分成多個小的服務,讓每個小服務做好自己的事即可。 經過拆分之後,就避

ASP.NET Core使用Razor視圖引擎渲染視圖為字符串(轉)

http onf ces mod ado efault his .html 返回 一、視圖渲染說明 在有些項目需求上或許需要根據模板生產靜態頁面,那麽你一樣可以用Razor語法去直接解析你的頁面從而把解析的頁面生成靜態頁,這樣的使用場景很多,不限於生成靜態頁面,視圖引擎為我