基於Coravel定時任務之計算總頁數

基於Coravel定時任務之計算總頁數


1 應用背景

在物聯網系統中,須要計算底端全部設備的總數,除以分頁每頁顯示數量,進行一個總頁數的顯示。包括狀態,告警,日誌等等數據都須要對應的總頁數的顯示。
linux


2 對比各家定時庫

2.1 TaskScheduler

TaskScheduler庫只支持.net,且須要結合windows任務計劃程序來調用,pass。git

2.2 Fluent Scheduler

Fluent Scheduler只支持.net,pass。github

2.3 Quartz.net

自己框架過重,並且使用複雜,pass。web

2.4 Hangfire

相對Quartz輕量不少,使用也簡單,並且有網頁能夠訪問來觀察任務執行狀況,可是有一個致命的缺點就是隻能支持分鐘及以上的定時任務處理緣由在於Hangfire用的是開源的NCrontab組件,跟linux上的crontab指令類似。在本應用中,總頁數在1分鐘以後更新,沒法忍受。pass數據庫

2.5 Coravel

框架輕,使用簡單,支持秒級定時任務。Coravel Pro能夠鏈接數據庫進行任務調度,Coravel Pro能夠支持web可視化,將任務執行狀況經過web顯示出來。適合本應用背景。
windows


3 Coravel的通常使用

3.1 Nuget安裝

在調用類庫層安裝Coravel。
緩存

3.2 依賴注入

在startup.cs中的ConfigureServices方法中進行依賴注入
services.AddScheduler();app

3.3 配置調度器

在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();
  });

3.4 運行程序,觀察輸出

從上圖結果中能夠看到任務1每隔1秒打印輸出;任務2每隔5秒打印輸出,正確。

3.5 Cron 表達式

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

3.6 錯誤支持

Coravel 發佈於2018年6月28日,纔剛起步還不成熟,我在調試工做日秒級定時任務的時候會報錯。
詳見#91 https://github.com/jamesmh/coravel/issues/91
做者在幾小時內利用工做時間,解決了問題,還發布到nuget2.5.1。非常感動。

3.7其餘功能支持

此外,Coravel還支持任務隊列,緩存,事件組播,郵件等。任務隊列可依據讀者使用狀況,視狀況另起一篇,緩存不建議用此組件,可用Easycache。事件組播亦不建議用此庫,可參考 http://www.javashuo.com/article/p-pfmnssgh-er.html。 郵件亦不建議用此組件。

3.8 Coravel Pro

Coravel Pro能夠鏈接數據庫進行任務調度,Coravel Pro能夠支持web可視化,將任務執行狀況經過web顯示出來。在這裏不作詳細介紹,有須要的讀者可自行研究。


4 Coravel的鬆耦合使用(含總頁數統計)

4.1 依賴注入自定義類

ConfigureServices中對鬆耦合的類Statistic進行依賴注入

services.AddTransient<Statistic>();

4.2配置調度器

在startup.cs中的Configure方法中配置自定義鬆耦合任務

var provider = app.ApplicationServices;     
    provider.UseScheduler(scheduler =>
         {
             scheduler.Schedule<Statistic>()
             .EverySecond()
             .Weekday();
         });

4.3 編寫鬆耦合任務的代碼

詳細說明,見代碼註釋。

using Coravel.Invocable;//須要引用此類庫來進行自定義任務
using IBMS.Infrastruct.UoW;
using System;
using System.Threading.Tasks;

namespace IBMS.WEBAPI.Extension
{
    public class Statistic: IInvocable
    {
        //工做單元依賴注入
        UnitOfWork _unitOfWork;
        public Statistic(UnitOfWork unitOfWork)
        {
            _unitOfWork = unitOfWork;
        }
        public  async Task Invoke()
        {
           //按每頁10分頁計算出來的總頁數
            var IPBoxCount = _unitOfWork.IPBoxRepository.Count()/10+1;
            Console.WriteLine("Every second during the week.");
            Console.WriteLine("Count:{0}", IPBoxCount);
        }
    }
}

注意:1.編寫的任務必定要在 Invoke中,這屬於固定格式;public async Task Invoke() {};2. 須要引入如下庫:using Coravel.Invocable;


5. 結果驗證

5.1 數據庫有102條數據。按每10條分一頁,總頁數爲11頁。

5.2 結果輸出

從結果能夠看出,定時計算出總頁數11頁定時1秒輸出。同時能夠看到EF Cor ORM最終生成的數據庫語句,與咱們的指望相符。

SELECT COUNT(*)
    FROM `IPBox` AS `c`


6 小結

固然總頁數的計算能夠在每次查詢時生成,以下

var IPBoxCount =  _unitOfWork.IPBoxRepository.Count()/10+1;
return Json(new { pageModel, IPBoxCount });

我的以爲,若是數據量小能夠直接查詢總數,計算總頁數而後返回的方法;若是數據量很大,好比100萬的數據(狀態,告警,日誌信息等),可能會拖慢速度,使網頁變卡,則使用定時計算總頁數的方法爲佳。您以爲呢?不合理的地方能夠留言。筆者發如今國內寫Coravel的文章尚未,若是以爲本文能夠,歡迎點右下角推薦,讓Coravel這個優雅的工具被更多人知曉使用。

相關文章
相關標籤/搜索