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

来源:https://www.cnblogs.com/JerryMouseLi/archive/2019/06/19/11054546.html
-Advertisement-
Play Games

[toc] 基於Coravel定時任務之計算總頁數 1 應用背景 在物聯網系統中,需要計算底端所有設備的總數,除以分頁每頁顯示數量,進行一個總頁數的顯示。包括狀態,告警,日誌等等數據都需要對應的總頁數的顯示。 2 對比各家定時庫 2.1 TaskScheduler TaskScheduler庫只支持 ...


目錄

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


1 應用背景

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


2 對比各家定時庫

2.1 TaskScheduler

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

2.2 Fluent Scheduler

Fluent Scheduler只支持.net,pass。

2.3 Quartz.net

本身框架太重,而且使用複雜,pass。

2.4 Hangfire

相對Quartz輕量很多,使用也簡單,而且有網頁可以訪問來觀察任務執行情況,但是有一個致命的缺點就是只能支持分鐘及以上的定時任務處理原因在於Hangfire用的是開源的NCrontab組件,跟linux上的crontab指令相似。在本應用中,總頁數在1分鐘之後更新,無法忍受。pass

2.5 Coravel

框架輕,使用簡單,支持秒級定時任務。Coravel Pro可以連接資料庫進行任務調度,Coravel Pro可以支持web可視化,將任務執行情況通過web顯示出來。適合本應用背景。


3 Coravel的一般使用

3.1 Nuget安裝

在調用類庫層安裝Coravel。

3.2 依賴註入

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

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。事件組播亦不建議用此庫,可參考 https://www.cnblogs.com/JerryMouseLi/p/11012839.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這個優雅的工具被更多人知曉使用。



您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 您將會從這篇文章里學習到如何在當下的 Vue.js 開發領域取得一定的成績。 ...
  • [2019.06.20 學習筆記1] 1.父子元素 2.兄弟元素 ...
  • HTTP協議 1 HTTP請求狀態碼 當用戶試圖通過 HTTP 訪問一臺正在運行 Internet 信息服務 (IIS) 的伺服器上的內容時,IIS 返回一個表示該請求的狀態的數字代碼。狀態代碼可以指明具體請求是否已成功,還可以揭示請求失敗的確切原因。 1.1 1xx - 信息提示 這些狀態代碼表示 ...
  • 一、瀏覽器介紹 瀏覽器是網頁運行的平臺,常用的瀏覽器有 IE、火狐(Firefox)、谷歌(Chrome)、Safari和Opera等。我們平時稱為五大瀏覽器。 可以通過這個網址 http://tongji.baidu.com/data/browser 查看瀏覽器的占有的市場份額 二、瀏覽器內核 1 ...
  • [2019.06.19 學習筆記4] 1.標簽格式 <開始標簽></結束標簽> 不區分大小寫,而且規則寬鬆。推薦小寫,並且要求成對編寫。 2.閉合標簽 <h1>內容</h1> 3.自閉合標簽(沒有內容的標簽) <img/> ...
  • 技術人員在構思一項功能時,會同時在大腦中編織其實現細節! 不利的一面 這種編織過程就像本能難以避免,它有優勢,對現實可行性更有判斷,但不利的影響也很明顯! 1、容易陷入細節,破壞思維的整體性。 2、構思的實現複雜度會直接影響決策。 這種構思本身受個人經驗所限。事實上實際複雜度有不確定性,再加上複雜度 ...
  • 今天,早早的起床,被外面火辣辣的太陽曬紅了臉。洗漱完發現已經遲到了,又不能吃早餐,來到了教室,面對著操蛋的課程,很令人蛋疼。啊,,,,美好的一上午就這麼結束了。 ...
  • 本章描述了團隊為準備Contoso會議管理系統的第一個產品版本所做的更改。這項工作包括對前兩章介紹的訂單(Order)和註冊(Registrations)限界上下文的一些重構和功能添加,以及一個新的會議管理(Conference Management)限界上下文和一個新的支付(Payment)限界上... ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...