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