【项目升级】集成Quartz.Net Job实现(一)
這兩天的新聞也是越來越多了,不僅Github接手了NPM,還有.NET 5也要新鮮出爐了(11月正式發布),當然還有MVP峰會也正在如火如荼的展開,會有哪些好的東西被碰撞出來,也是很期待的。這些天我也簡單的開始了學習之路,網路一直不好,直播也就不好展開,但是肯定會有的,應該過不了多久,所以暫時通過文字來講解吧。
BCVP(也就是Blog.Core和Vue的全家桶)項目開源一年多,我也一直在開發和維護,目標呢,也一直致力于打造一個開箱即用的豐富小框架,目前的核心功能如下:
也算是完成了九層了吧,剩下的10%屬于錦上添花的功能,一般小項目可能用不上,但是中型項目是必須要用的,今天的重點就是說說作業調度Quzrtz.net,目前已經集成到了項目里,為了不影響Master分支,目前代碼在is4分支上,感興趣的小伙伴可以自行PULL下來看看,目前的效果是這樣的,下篇文章會集成到Blog.Admin項目中。
(任務調度展示,可持久化到數據庫)
本文重點參考Kawhi代碼,自己做了調整:
【壹起學】1:Uwl.Admin開源框架基于QuartzNet的實現
這個系列我打算寫三篇文章和一篇視頻的形式,文章分為后端、前端、原理三篇,視頻就是總體串一下,今天就是第一篇,簡單說說后端的配置和操作,不講原理。
為什么要使用Quartz.Net
關于Quartz.Net的概念、內容和工作原理UML這都不說了,相信你如果看到了這個文章標題,并點進來了,應該知道這是干啥的,也應該知道他的應用場景——任務調度,白話就是通過一定的簡單配置,定時去執行一些任務,多見于統計和同步操作。
這里簡單的貼一下它Github的數據,就足可見受歡迎度:
(我一直認為,好的開源項目,要看Closed了多少Issue)
其實本來我的項目中已經有了一套任務執行程序,用的還是微軟的自帶的HostingService
用起來是特別簡單,幾乎不用配置,只需要創建一個Service,然后直接寫邏輯就行了,它會隨著我們的運行的項目一起執行,如果說你的任務調度很簡單,就是定時跑一個小方法,我還是比較推薦這個的,當然,這個也是有很多問題,比如不能手動動態配置,不能手動控制任務的啟動、暫停、重啟等多個操作,所以,應群友的號召,我就把.net中用的較多的Quzrtz給集成到了項目里,當然還有一個Hangfire也很流行,我目前公司老的項目中是用的這個Hangfire,但是我感覺有些臃腫了,不太應景NetCore這么優雅的高效框架。
后端如何配置Quartz.Net
01
創建任務數據庫表以及四層服務
既然我們要動態配置到數據庫里,那肯定就需要一個數據庫表結構了,這個過程就是很簡單的了,得益于我們有強大的Seed功能,無論是是CodeFirst生成數據庫表結構,還是根據表結構利用FrameSeed生成四層文件,都很簡單。
首先是創建實體類,然后生成到數據庫中,我已經配置好了:
/// <summary>/// 任務計劃表/// </summary>public class TasksQz : RootEntity{/// <summary>/// 任務名稱/// </summary>[SugarColumn(ColumnDataType = "nvarchar", Length = 200, IsNullable = true)]public string Name { get; set; }/// <summary>/// 任務分組/// </summary>[SugarColumn(ColumnDataType = "nvarchar", Length = 200, IsNullable = true)]public string JobGroup { get; set; }/// <summary>/// 任務運行時間表達式/// </summary>[SugarColumn(ColumnDataType = "nvarchar", Length = 200, IsNullable = true)]public string Cron { get; set; }/// <summary>/// 任務所在DLL對應的程序集名稱/// </summary>[SugarColumn(ColumnDataType = "nvarchar", Length = 200, IsNullable = true)]public string AssemblyName { get; set; }/// <summary>/// 任務所在類/// </summary>[SugarColumn(ColumnDataType = "nvarchar", Length = 200, IsNullable = true)]public string ClassName { get; set; }/// <summary>/// 任務描述/// </summary>public string Remark { get; set; }/// <summary>/// 執行次數/// </summary>public int RunTimes { get; set; }/// <summary>/// 開始時間/// </summary>public DateTime? BeginTime { get; set; }/// <summary>/// 結束時間/// </summary>public DateTime? EndTime { get; set; }/// <summary>/// 觸發器類型(0、simple 1、cron)/// </summary>public int TriggerType { get; set; }/// <summary>/// 執行間隔時間, 秒為單位/// </summary>public int IntervalSecond { get; set; }/// <summary>/// 是否啟動/// </summary>public bool IsStart { get; set; } = false;/// <summary>/// 執行傳參/// </summary>public?string?JobParams?{?get;?set;?}[SugarColumn(IsNullable = true)]public bool? IsDeleted { get; set; }/// <summary>/// 創建時間/// </summary>[SugarColumn(IsNullable = true)]public DateTime CreateTime { get; set; } = DateTime.Now;}然后SeedData到數據庫:
然后配置種子數據:
(啟動項目,自動SeedData)
生成到數據庫后,然后我們就需要生成四層服務文件,因為我們的Blog.Core項目已經封裝了代碼生成器,還是兩個,你可以用T4,也可以用DbFirstController.cs這個控制器方法,只需要FrameSeed.cs文件中,配置上表名就行了:
最后可以創建一個控制器,對這個表進行CURD操作,不贅述。核心要說的,還是我們的任務調度中心。
02
創建任務調度服務中心
當然,首先我們需要引用Nuget包:
// 在Blog.Core.Tasks 層安裝 <PackageReference Include="Quartz" Version="3.0.7" />新建QuartzNet文件夾,創建調度服務接口和實現類,具體的原理我會在第三篇簡單說下:
主要就是利用IScheduler對Job進行處理,核心的邏輯和代碼都在實現類類,今天暫時先不進行講解,具體的可以查看SchedulerCenterServer.cs
配置好了服務以及調度中心,接下來就是創建一個個Job類了。
03
創建Job工作
顧名思義,我們要想實現任務調度,就需要創建很多個Job工作類,讓調度中心自己根據相應的邏輯機制來去調度,我這里創建了一個簡單的Job作為示例:
通過接口調用
這個就很簡單了,畢竟我們前后端分離,要通過接口的形式來對我們的任務進行調度,這里簡單的列舉一個就行了:
最后的最后,不要忘記把相應的服務和接口進行注冊:
好啦,關于后端如何配置任務調度Quzrtz.Net,就暫時說到這里了,下篇簡單說下如何在前端配置頁面吧,這兩天我先設計著。
總結
以上是生活随笔為你收集整理的【项目升级】集成Quartz.Net Job实现(一)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 使用GUI工具Portainer.io管
- 下一篇: 论ORM之EFCore初篇(快速基于本地