目錄
- 基于Coravel定時任務之物聯網裝置數量統計
- 1 應用背景
- 2 對比各家定時庫
- 2.1 TaskScheduler
- 2.2 Fluent Scheduler
- 2.3 Quartz.net
- 2.4 Hangfire
- 2.5 Coravel
- 3 Coravel的一般使用
- 3.1 Nuget安裝
- 3.2 依賴注入
- 3.3 配置排程器
- 3.4 運作程式,觀察輸出
- 3.5 Cron 表達式
- 3.6 錯誤支援
- 3.7其他功能支援
- 3.8 Coravel Pro
- 4 Coravel的松耦合使用(含總頁數統計)
- 4.1 依賴注入自定義類
- 4.2配置排程器
- 4.3 編寫松耦合任務的代碼
- 5. 結果驗證
- 5.1 前端顯示總數資料庫記錄總數相等,并且資料可以實時更新。
- 6 其他
- 7 小結
在物聯網系統中,需要計算底端所有裝置的總數,顯示在Dashboard中,進行一個總數的顯示。包括離線,告警,停運等等資料都需要對應的總數的統計顯示。
TaskScheduler庫隻支援.net,且需要結合windows任務計劃程式來調用,pass。
Fluent Scheduler隻支援.net,pass。
本身架構太重,而且使用複雜,pass。
相對Quartz輕量很多,使用也簡單,而且有網頁可以通路來觀察任務執行情況,但是有一個緻命的缺點就是隻能支援分鐘及以上的定時任務處理原因在于Hangfire用的是開源的NCrontab元件,跟linux上的crontab指令相似。在本應用中,總頁數在1分鐘之後更新,無法忍受。pass
hangfire 7.0 以上版本已經支援 Cron 表達式和秒級時間粒度了
在此感謝網友 @ Name="Jaly"
架構輕,使用簡單,支援秒級定時任務。Coravel Pro可以連接配接資料庫進行任務排程,Coravel Pro可以支援web可視化,将任務執行情況通過web顯示出來。适合本應用背景。
在調用類庫層安裝Coravel。
在startup.cs中的ConfigureServices方法中進行依賴注入
services.AddScheduler();
在startup.cs中的Configure方法中配置鍊兩個定時任務
var provider = app.ApplicationServices;
provider.UseScheduler(scheduler =>
{//配置任務1方法
scheduler.Schedule(() => Console.WriteLine("Every second during the week."))
//工作日每隔1秒輸出
.EverySecond()
.Weekday();
});
provider.UseScheduler(scheduler =>
{//配置任務2方法
scheduler.Schedule(() => Console.WriteLine("Every 5 second during the week."))
//工作日每隔5秒輸出
.EverySeconds(5)
.Weekday();
});
從上圖結果中可以看到任務1每隔1秒列印輸出;任務2每隔5秒列印輸出,正确。
Coravel 支援Cron Expressions,有需要的可以根據應用場景設定Cron表達式
- * * * * * run every minute
- 00 13 * * * run at 1:00 pm daily
- 00 1,2,3 * * * run at 1:00 pm, 2:00 pm and 3:00 pm daily
- 00 1-3 * * * same as above
- 00 */2 * * * run every two hours on the hour
Coravel 釋出于2018年6月28日,才剛起步還不成熟,我在調試工作日秒級定時任務的時候會報錯。
詳見#91 https://github.com/jamesmh/coravel/issues/91
作者在幾小時内利用工作時間,解決了問題,還釋出到nuget2.5.1。很是感動。
此外,Coravel還支援任務隊列,緩存,事件多點傳播,郵件等。任務隊列可依據讀者使用情況,視情況另起一篇,緩存不建議用此元件,可用Easycache。事件多點傳播亦不建議用此庫,可參考 https://www.cnblogs.com/JerryMouseLi/p/11012839.html。 郵件亦不建議用此元件。
Coravel Pro可以連接配接資料庫進行任務排程,Coravel Pro可以支援web可視化,将任務執行情況通過web顯示出來。在這裡不做詳細介紹,有需要的讀者可自行研究。
ConfigureServices中對松耦合的類Statistic進行依賴注入
services.AddTransient<Statistic>();
在startup.cs中的Configure方法中配置自定義松耦合任務
var provider = app.ApplicationServices;
provider.UseScheduler(scheduler =>
{
scheduler.Schedule<Statistic>()
.EverySecond()
.Weekday();
});
詳細說明,見代碼注釋。
using Coravel.Invocable;//需要引用此類庫來進行自定義任務
using IBMS.Infrastruct.UoW;
using System;
using System.Threading.Tasks;
public class StatisticTask: IInvocable
{
private readonly IStatisticsServices _statisticsServices;
private readonly IIPBoxServices _iPBoxServices;
public StatisticTask(IStatisticsServices statisticsServices, IIPBoxServices iPBoxServices,)
{
_statisticsServices = statisticsServices;
_iPBoxServices = iPBoxServices;
}
public async Task Invoke()
{
var _ipboxCount = await _iPBoxServices.CountAsync();//查詢裝置總數
var response = await _statisticsServices.GetAsync(1);//統計表取出
response.IpboxTotal = (int)_ipboxCount;//存入統計表緩存
await _statisticsServices.UpdateAsync(response);//更新統計表
}
}
注意:1.編寫的任務一定要在 Invoke中,這屬于固定格式;public async Task Invoke() {};2. 需要引入以下庫:using Coravel.Invocable;
計算總裝置總頁數的計算可以在每次查詢時生成,如下
var IPBoxCount = _unitOfWork.IPBoxRepository.Count();
return Json(new { pageModel, IPBoxCount });
這裡需要VUE前端以Axios形式來定時擷取統計表,後續會改成後端Coravel定時計算好之後,以SignalR形式主動推送到前端進行總覽顯示。
本文主要推薦Coravel這個定時工具的使用,讓Coravel這個優雅的工具被更多人知曉使用。
The Sky is the limit.