Hangfire:是一個開源的job調度系統,支持分佈式JOB!!html
Hangfire.HttpJob 是我針對Hangfire開發的一個組件,該組件和Hangfire自己是獨立的。能夠獨立更新Hangfire版本不影響!node
該組件已被Hangfire官方採納,在Hangfire官網能夠查到:git
開源地址:github
https://github.com/yuzd/Hangfire.HttpJobweb
剝離Job調度和業務sql
缺點: 這樣就耦合在了一塊兒,若是業務線增大,會致使每一個業務線的Job處理邏輯都得和Hangfire耦合在一塊兒!發佈的時候全部業務線Job都得暫停調度
優勢:這樣就解耦了Hangfire和業務處理邏輯,業務job開發者能夠忽略Hangfire的存在!不一樣的業務線分開不一樣的JobAgent能夠分別部署,發佈互不影響
是對Hangfire的一個擴展插件,利用Hangfire.HttpJob能夠快速搭建分部署Job調度Server。json
特色是:api
是一個基於netcore web的一箇中間件,專門用於配合Hangfire.HttpJob 開發HttpJob的組件markdown
NUGET地址:Install-Package Hangfire.HttpJob.Agentapp
幫助快速建立HttpJob並有如下特點
JobAgent 是做爲一箇中間件來使用的 DEMO 能夠查看 https://github.com/yuzd/Hangfire.HttpJob/tree/master/Test/TestHangfireAgent
JobAgent:一個JobAgent表示一個App 經過netcore web形式部署,一個JobAgent能夠宿主多個Job
Job:表示單個Job,用於處理特定的業務邏輯
安裝nuget包
這裏我也用NLOG組件來記錄日誌: 因此也安裝下Nlog的包: NLog.Extensions.Logging
新增一個Nlog.config文件,能夠參考 https://github.com/yuzd/Hangfire.HttpJob/blob/master/Test/TestHangfireAgent/NLog.Config
配置startup
在appsettings.json裏面配置JobAgent的啓動參數
參數說明
字段名稱 | 備註 |
---|---|
Enabled | 表明是否啓用JobAgent |
SitemapUrl | 表明JobAgent的請求地址 默認"/jobagent" |
EnabledBasicAuth | 表明是否開啓basicAuth認證 若是true 須要設置下面2個參數 |
BasicUserName | basicAuth認證的用戶名 |
BasicUserPwd | basicAuth認證的密碼 |
PS:Job類都是註冊在Netcore 的 DI容器裏面的,因此能夠在job類的構造方法 注入你想要的類,好比Logger組件
新建一個cs 叫 TestJob.cs
讓它繼承 JobAgent 而且重寫 下面3個方法
特別說明: OnStart方法在被執行的時候是在一個獨立的線程執行的,因此可以執行長時間的任務
默認註冊的單例JOB,下面會有多例的舉例
# 特別要注意的如下幾個參數
1. Url 要填 Agent的註冊地址 「/jobagent」
2. BasicUserName 和 BasicPassword 要填 Agent的配置的basicAuth
3. AgentClass 要填你添加的job類的完整名稱
4. DelayFromMinutes這裏咱們填-1 表明必須手動執行 若是填0表明是當即執行 若是填>1 表明延遲分鐘數
# 那麼對應以下填寫:
{
"JobName": "TestJob", //Job名稱
"Method": "POST", //http請求的方法
"ContentType": "application/json", //http參數類型
"Url": "http://localhost:5002/jobagent", //Agent的註冊地址
"DelayFromMinutes": -1, //-1表明必須手動啓動
"Data": "",
"Timeout": 5000, //http調用超時設置
"BasicUserName": "test", //Agent設置的basicAuth
"BasicPassword": "123456", //Agent設置的basicAuth
"EnableRetry": false,
"SendSucMail": false,
"SendFaiMail": true, //http失敗時發郵件通知
"Mail": "1877682825@qq.com", //http調用失敗通知我
"AgentClass": "TestHangfireAgent.Jobs.TestJob,TestHangfireAgent"
}
添加成功後能夠在job列表查到
以下圖所示:
能夠填參數 也能夠不填參數 這裏咱們測試就隨便寫
能夠看到AgentJob的控制檯看到 調用執行成功 參數也傳的沒問題
再回到Hangfire的後臺看下調用的日誌
注意:因爲這個是一個單例的JOB,在Onstart方法裏面咱們 採用 await Task.Delay(1000 * 10); 延遲了10秒 因此若是你在這10秒內重複執行這個Job 會提示 這個Job正在running 不能從新啓動!等OnStart方法執行完畢後這個job才能被再次調用
其實很簡單 就是在類上面加一個[TransientJob]標籤就變成多例了
以下圖所示 咱們建立一個測試多例的job:TestTransientJob.cs 而後在它的類上面打上一個[TransientJob]標籤 以下圖所示:
採用和上面同樣的方式註冊到Hangfire裏面去! 和上面單例的惟一區別就是 多例的Job 每次都是一個新的實例,不會判斷你上一個實例有沒有執行完.
意思就是 Job在執行OnStart方法完成的時候 不去結束這個Job 而是Hang住。 和Console.ReadKey() 相似的感受!!
等到收到OnStop命令纔去終止這個Job。
常見使用場景:消息隊列Client端處理
使用也很簡單 在類上打一個標籤[HangJobUntilStop(true)]便可
NUGET 地址: https://www.nuget.org/packages/Hangfire.HttpJob.Agent.MysqlConsole/
也是開源的 開源代碼在:https://github.com/yuzd/Hangfire.HttpJob
這個中間件的目的是能讓JobAgent 寫log到hangfire的Console
如圖:
首先引用上面的MysqlConsole中間件的NUGET包
在application.json裏面配置
在startUp.cs文件裏面註冊
在Job類裏面使用
若是你不註冊使用MysqlConsole這個中間件的話,
那麼默認的: jobContext.Console.WriteLine 方法 等於 _logger.LogInformation(message);