項目介紹:
Hangfire:是一個開源的job調度系統,支持分布式JOB!!
Hangfire.HttpJob 是我針對Hangfire開發的一個組件,該組件和Hangfire本身是獨立的。可以獨立更新Hangfire版本不影響!
該組件已被Hangfire官方采納,在Hangfire官網可以查到:
開源地址:
https://github.com/yuzd/Hangfire.HttpJob
該項目目的是:
剝離Job調度和業務
Hangfire.HttpJob究竟是干嘛的
- 傳統使用Hangfire都是把JOb的處理邏輯代碼寫在和Hangfire的同一個工程!
缺點: 這樣就耦合在了一起,如果業務線增大,會導致每個業務線的Job處理邏輯都得和Hangfire耦合在一起!發布的時候所有業務線Job都得暫停調度
- 而使用了Hangfire.HttpJob的話 就是把Hangfire的服務拓展成可以把Job的處理邏輯代碼寫在別的工程里面(以webapi的形式暴露給Hangfire去調度)
優點:這樣就解耦了Hangfire和業務處理邏輯,業務job開發者可以忽略Hangfire的存在!不同的業務線分開不同的JobAgent可以分別部署,發布互不影響
Hangfire.HttpJob
是對Hangfire的一個擴展插件,利用Hangfire.HttpJob可以快速搭建分部署Job調度Server。
特點是:
- 業務與調度完全分離。
- 支持定點執行 延遲執行 周期性循環執行,支持秒級別
- 配合JobAgent組件可以實現Job管理 監控 日志等
共有三篇文章
開源分布式Job系統,調度與業務分離-如何創建一個計划httpjob任務
開源分布式Job系統,調度與業務分離-如何創建周期性的HttpJob任務
開源分布式Job系統,調度與業務分離-HttpJob.Agent組件介紹以及如何使用
本篇教程:如何創建一個周期性的HttpJob任務的
周期性的HttpJob任務的定義
- 是多次運行的job 采用Cron表達式進行定義運行規則
注意事項
- 最新版的hangfire已支持 6位數的Cron表達式(支持到秒級)
- 但是我在hangfire的dashbord擴展的Cron生成頁面還不支持到秒級別(大家可以在google找可以生成6位的網站工具)
1. 進入hangfire的后台 點擊 上側欄【周期性作業】
如下圖所示:
針對周期性作業 可以看到有三個按鈕
按鈕名稱 | 說明 |
---|---|
新增周期性作業 | 新增一個周期性httpjob作業 |
編輯周期性作業 | 如果你重新編輯該周期性httpjob作業內容可以點擊該按鈕 |
Cron表達式生成 | 跳轉到Cron表達式生成頁面 |
1. 生成Cron表達式
點擊【Cron表達式生成】 進入Cron表達式生成頁面 如下圖:
例如 我想要 每天晚上8點05分執行
得出結果:【5 20 * * *】
2.新增周期性作業
點擊【新增周期性作業】按鈕 會出現一個json編輯器
json編輯器的參數說明如下
字段名稱 | 備注 |
---|---|
JobName | 你給這個httpjob起的名稱【必填項】 |
Method | 這個httpjob的請求方式 "get" 或者 "post" 【必填項】 |
ContentType | 這個httpjob的請求ContentType 默認"application/json" 【必填項】 |
Url | 這個httpjob的請求url 【必填項】 |
Cron | Cron表達式 可以先用【Cron表達式生成】功能生成好,如果為空 代表只能手動觸發執行 |
Data | 這個httpjob在Method=“post”的時候可以指定post的內容,可以是一個對象也可以是一個string或者其他類型 |
Timeout | 這個httpjob請求的超時時間(單位是毫秒 例如5000 代表是5秒) |
BasicUserName | 這個httpjob請求需要啟用basic認證時設置的username |
BasicPassword | 這個httpjob請求需要啟用basic認證時設置的密碼 |
EnableRetry | 失敗的時候(比如超時 遠程服務器請求錯誤等)是否啟用重試 默認false ,如果設置true 會重試最大3次 |
SendSucMail | 這個httpjob請求無異常的時候是否發送通知郵件 默認false |
SendFaiMail | 這個httpjob請求異常的時候是否發送通知郵件 默認true |
設置通知郵件地址 如果有多個用半角逗號隔開 | |
AgentClass | 如果是AgentJob開發的httpjob 則需要填寫,填寫的是完整的類型格式{namespace},{程序集的名稱} 例如:TestHangfireAgent.Jobs,TestHangfireAgent |
舉例
比如 每天晚上8點執行一次查詢訂單已完成超xx小時了(xx作為參數) 但是還沒有點評的 發短信讓催點評 接口地址:http://localhost:5000/scoreOrder 訪問方式是POST 接口有basicAuth驗證 用戶名是admin 密碼是test # 那么對應如下填寫: { "JobName": "scoreOrder", //Job名稱 "Method": "POST", //http請求的方法 "ContentType": "application/json", //http參數類型 "Url": "http://localhost:5000/scoreOrder",//接口的地址 "Cron": "5 20 * * *", //每天晚上8點05分執行 "Data": { "Hour":48 //傳的參數超過48小時 }, "Timeout": 5000, //http調用超時設置 "BasicUserName": "admin", //http調用的basicAuth "BasicPassword": "test", //http調用的basicAuth "EnableRetry": false, "SendSucMail": false, "SendFaiMail": true, //http失敗時發郵件通知 "Mail": "1877682825@qq.com", //http調用失敗通知我 "AgentClass": "" }
點擊【提交】
添加成功 在job列表可以查
我剛才設置的是20:05分執行
目前時間是19:50
正好是還有15分鍾就要執行了 說明Cron表達式沒有問題
對於周期性job 有3個按鈕可以操作
按鈕名稱 | 說明 |
---|---|
立即執行 | 如果你希望不要等到8點05想立即就執行可以點擊它 |
停止或開始任務 | 如果你希望暫停這個周期性job 可以點它,點完之后再次點擊就是開啟 |
編輯周期任務 | 如果你剛剛添加的參數有錯誤,可以點擊這個按鈕重新編輯提交 |
停止或開始任務
如果一個周期性job是暫停的 會以紅色字體展示
編輯周期任務
點擊提交修改
周期性job執行
周期性job執行完畢 在完成列表可以查詢
點擊job編號進入job詳情頁查看具體執行情況和日志
也可以在Tag頁面進行查看
說明:Tag頁面是按jobName進行分組查詢的
點擊某一個jobName 進入該jobName下所有的運行完成的job列表