.Net Core小技巧 - Hosted Services + Quartz实现定时任务调度
背景
之前一直有朋友問,.Net Core + Linux環境有沒有類似Windows服務的東西。其實是有的,我了解的方法有兩種:
#1 創建一個ASP.Net Core的Web項目(如Web API),然后通過添加中間件(Middleware)的方式來啟動任務;
#2 創建一個.Net Core的項目,添加Host,Dependency Injection,Configuration等組件,然后通過Main方法或中間件的方式啟動服務。
?
但是,上述兩種方法都有點不足,如:
#1 會把Web的生命周期引進來,但實際上,我們并不需要Web的功能,如Controller;
#2 本身是沒有問題的,但是對開發者的要求相對高一點點,需要對.Net Core的各個組成部分都有一定的認識,簡而言之,門檻有一丟丟高。
?
.Net Core 2.1推出了一個Generic Host的概念,可以很好的解決上面兩種方法的不足:
至于為什么選擇Quartz來做調度,我想可能是因為情懷吧,因為之前是用的TopShelf+Quartz,其實Hangfire也不錯。
?
使用Hosted Service
1. 創建一個控制臺程序。
?
2. 添加Host Nuget包。
3. 添加一個基于Timer的簡單Hosted Service(用于簡單演示),繼承IHostedService。
4. Main函數中添加Host的相關代碼。
5. 查看結果
?
?
6. 代碼解析
a. Host配置
.ConfigureHostConfiguration(configHost =>
{
//配置根目錄
configHost.SetBasePath(Directory.GetCurrentDirectory());?
?
//讀取host的配置json,和appsetting類似,暫不需要先注釋掉,可根據需要開啟
//configHost.AddJsonFile("hostsettings.json", true, true);?
?
//讀取環境變量,Asp.Net core默認的環境變量是以ASPNETCORE_作為前綴的,這里也采用此前綴以保持一致
configHost.AddEnvironmentVariables("ASPNETCORE_");?
?
//可以在啟動host的時候之前可傳入參數,暫不需要先注釋掉,可根據需要開啟
//configHost.AddCommandLine(args);
})
?
b. App配置
.ConfigureAppConfiguration((hostContext, configApp) =>
{
//讀取應用的配置json
configApp.AddJsonFile("appsettings.json", true);?
?
//讀取應用特定環境下的配置json
configApp.AddJsonFile($"appsettings.{hostContext.HostingEnvironment.EnvironmentName}.json", true);?
?
//讀取環境變量
configApp.AddEnvironmentVariables();?
?
//可以在啟動host的時候之前可傳入參數,暫不需要先注釋掉,可根據需要開啟
//configApp.AddCommandLine(args);
})
?
c. 配置服務及依賴注入注冊,注:沒有Middleware的配置了。
.ConfigureServices((hostContext, services) =>
{
//添加日志Service
services.AddLogging();
?
//添加Timer Hosted Service
services.AddHostedService<TimedHostedService>();
})
?
?d. 日志配置
.ConfigureLogging((hostContext, configLogging) =>
{
//輸出控制臺日志
configLogging.AddConsole();
?
//開發環境輸出Debug日志
if (hostContext.HostingEnvironment.EnvironmentName == EnvironmentName.Development)
{
configLogging.AddDebug();
}
})
?
e. 使用控制臺生命周期
.UseConsoleLifetime() //使用Ctrl + C退出
?
其它詳細的可參考:https://docs.microsoft.com/en-us/aspnet/core/fundamentals/host/generic-host?view=aspnetcore-2.1
?
使用Quartz
1. 添加Host Nuget包。
Install-Package Quartz -Version 3.0.5Install-Package Quartz.Plugins -Version 3.0.5?
2. Quartz配置。
之前Quartz的配置是放在quartz.config里面的,但我更喜歡使用appsettings.json,因此,把配置改成了從appsettings.json。
先建一個QuartzOption的類:
3. 重寫JobFactory。
4. 編寫Quartz Hosted Service
5. 準備appsettings.json
6. 編寫一個TestJob
7. 準備Quartz的調度文件quartz_jobs.xml
8. 注冊Quartz Hosted Service和TestJob
9. 查看結果
?
10. 補充說明。
Generic Service默認的環境是Production,如果想使用Development環境,可以在項目屬性的Debug頁簽中添加環境變量來實現。
?
?
?
源碼地址
https://github.com/ErikXu/.NetCoreTips/tree/master/HostedService.Quartz
?便捷使用
https://www.nuget.org/packages/Quartz.HostedService/
https://github.com/ErikXu/Quartz.HostedService
相關文章:
ASP.NET Core 2.1 : 十一. 如何在后臺運行一個任務
原文地址: https://www.cnblogs.com/Erik_Xu/p/9219307.html
.NET社區新聞,深度好文,歡迎訪問公眾號文章匯總 http://www.csharpkit.com
總結
以上是生活随笔為你收集整理的.Net Core小技巧 - Hosted Services + Quartz实现定时任务调度的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Apache SkyWalking的架构
- 下一篇: EntityFramework Core