只有累積,沒有奇蹟

2023年10月1日 星期日

[NETCore] ASP.NET Core 中的排程利器 - Coravel

前言
在 ASP.NET 中相信大家都會有過開發 Scheduler 排程的需求,過去可能會使用 ASP.NET 中較有名的框架像是 Quartz.NET 或是 Hangfire,兩種框架各有優缺點小弟不才剛好都有碰過,兩種排程框架各有喜好者可以依據自己的愛好來選用。今天所要介紹的是另一套 Schedule Job 框架 Coravel,作者在設計 API 時用 Fluent interface 方式進行設計,因此在使用上相當直覺與方便,且完整的支援 ASP.NET Core 的應用程式,這篇就來分享一下有關 Corvael 的安裝與基本使用,若有問題或是錯誤的地方歡迎網路的高手大大給予指導

安裝
首先建立一個名為 CoravelLab 的 ASP.NET Core 應用程式專案,接著在 nuget 搜尋並下載 coravel 
下載過程中會提示安裝後的變更,我的習慣會把此設定打開也可以了解安裝時用到哪一些 dll,如果套件沒做甚麼事情又下載一堆 dll 的話我就會...,像是此套件有引用到 system.memory 才發現也支援 cache 功能,而且特別的有用到 system 中的 unsafe 
如果不喜歡 Nuget GUI 進行安裝的話,也可以透過 Nuget Package Console 輸入下列指令
  1. Install-Package Coravel -Version 3.0.0
安裝完畢之後到專案檔底下確認是否有安裝成功
  1. <ItemGroup>
  2. <PackageReference Include="Coravel" Version="3.0.0" />
  3. </ItemGroup>

使用
基本排程相關設定可以在 Coravel 官網 看到詳細說明,介紹筆記如下

Schedule 執行內容
Coravel 中使用排程服務是以  Schedule  出發,主要是去實作 IScheduler 介面,透過反組譯可以看到 IScheduler 代碼如下
  1. public interface IScheduler
  2. {
  3. IScheduleInterval Schedule(Action actionToSchedule);
  4.  
  5. IScheduleInterval ScheduleAsync(Func<Task> asyncTaskToSchedule);
  6.  
  7. IScheduleInterval Schedule<T>() where T : IInvocable;
  8.  
  9. IScheduleInterval ScheduleInvocableType(Type invocableType);
  10.  
  11. IScheduler OnWorker(string workerName);
  12. }
從上面代碼可以看到 IScheduler 支援多個 API 來設定排程,可以透過 action 方式
  1. scheduler.Schedule(() => Console.WriteLine("This is a book")
或者是指定特定的類別 Class 方式執行排程,使用類別必須實作 IInvocable 的方法
  1. scheduler.Schedule<SomeJobClass>()
另外還支援 ScheduleAsync 方法 
  1. scheduler.ScheduleAsync(async () =>
  2. {
  3. await Task.Delay(100);
  4. Console.WriteLine("async task laaa");
  5. })
上面幾種方法必須在使用前先確定有透過 DI 註冊才可以正常使用。

Schedule 執行頻率
Coravel 排程執行時間是透過程式內設定,不透過設定檔來定義,Coravel 內建提供多種方法來提供設定執行的頻率,如果要每秒執行一次就可以透過 EverySecond() 方法執行,或者是指定時間像是每周一的話可以用 Monday() 來設定排程要執行的頻率,舉例來說設定排程在 周末每五分鐘執行一次
  1. scheduler.Schedule<ReportJob>()
  2. .EveryFiveMinutes()
  3. .Weekend();
或是 每周一三五的半夜一點跑排程工作
  1. scheduler.Schedule<TodoJob>()
  2. .DailyAtHour(1)
  3. .Monday()
  4. .Wednesday()
  5. .Friday();
由於方法皆是回傳相同類別這種設計可以一直串流下去,也叫做 Fluent interface 流式接口設計,因此在使用上可以說是相當便利,另外如果內建方法中沒有喜歡的時間也可以使用 cron 方法自行執行時間,舉例來說下面設定是 cron 表達式中每分鐘執行一次 
  1. scheduler.Schedule<TodoJob>()
  2. .Cron("* * * * *");
除了支援常用的執行時間之外,另外還可透過 cron 方法自行定義自己喜歡的時間可以說是相當方便,在透過 R# 工具看過內建方法的底層也是透過 cron 方式進行設定 (偷學到一招),但有一點要特別注意的是他時間是以 UTC 時間為主,因此在使用上必須特別注意。

在 ASP.NET Core 中使用 
接著透過一個簡單的範例來介紹 Coravel 如何快速上手,開啟專案中 Startup.cs 的 ConfigureServices 加上  AddScheduler  將 Coravel 加入 service
  1. public void ConfigureServices(IServiceCollection services)
  2. {
  3. services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
  4. services.AddScheduler();
  5. }
下一步來使用 Coravel 建立一個簡單的 Schedule,目的是在每一秒透過 console 顯示不用上班的開心並示在畫面上,接著在 Configure 中加入下列代碼
  1. var provider = app.ApplicationServices;
  2. provider.UseScheduler(scheduler =>
  3. {
  4. scheduler.Schedule(
  5. () => Console.WriteLine("周末不用上班,Happy !!")) // 設定 Schedule 執行內容
  6. .EverySecond() // 設定 Schedule 執行時間及頻率
  7. });
執行專案,可以看到設定的內容順利的輸出

使用 Schedule<T>
透過 action 來設定相信算蠻簡單的,接著我們再加入一個是透過指定類別的排程,希望在周日每五秒顯示目前的時間,首先先建立 GetDatetimePreFiveSecondJob  類別並實作 IInvocable (需要先 using Coravel.Invocable ),代碼如下
  1. using Coravel.Invocable;
  2.  
  3. namespace CoravelLab
  4. {
  5. public class GetDatetimePreFiveSecondJob : IInvocable
  6. {
  7. public Task Invoke()
  8. {
  9. Console.WriteLine($"Now : {DateTime.Now}");
  10. return Task.CompletedTask;
  11. }
  12. }
  13. }
接著到 Startup.cs 的 ConfigureServices 將 GetDatetimePreFiveSecondJob 加入 service
  1. public void ConfigureServices(IServiceCollection services)
  2. {
  3. services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
  4. services.AddScheduler();
  5. services.AddTransient<GetDatetimePreFiveSecondJob>();
  6. }
到 Configure 定義新增 Schedule 並設定執行的頻率,使用內建設定執行時間 EveryFiveSeconds 以及 Sunday 方法
  1. provider.UseScheduler(scheduler =>
  2. {
  3. scheduler.Schedule<GetDatetimePreFiveSecondJob>()
  4. .EveryFiveSeconds()
  5. .Sunday();
  6. });
接著執行專案看結果,可以看到新增的排程順利執行

感想
希望可以透過這篇文章讓大家了解除了 Quartz.Net 與 Hangfire 之外,也是有輕量級的 Coravel 函式庫的基本使用方式與操作,Coravel 除了支援 Task Schedule 之外另外也提供 Queue、Cache、Event Brocdcasting 以及 Mail 等功能,如果有興趣的朋友也可以到官方網站看看,Hope it helps :)

參考
Coravel

Related Posts:

  • [NETCore] ASP.NET Core 建立排程服務 - 使用 Generic Host 搭配 Quartz.Net - Part 1前言 最近有個需求是固定時間取得特定資料進行修改,在查詢相關資料之後決定使用 ASP.NET Core Generic Host 為出發,在搭配 .NET 中熱門的排程套件 Quartz.Net,測試完畢之後再將程式註冊為 Windows Service 服務就可滿足使用者的需求,這篇文章是整理開發時的重點流程為系列文,給有需要使用 ASP.NET Core 開發排程相關應用程式需求的朋友一些參考,若有問題或是錯誤的地方歡迎各位高手給予… Read More
  • [Azure] 建立 Azure Container Registry 並整合 Microsoft Team 通知前言 在 上一篇 介紹了使用 Azure 的 Web App For Container 服務將 Docker Image 部署至 Microsoft Azure,在 Demo 過程中 Image 是放置在公開的 Docker Hub 上,但在實務上不太可能將應用程式 Docker Image 檔案公開,如果希望可以建立私有的 Docker 服務時可以使用 Azure 中的 Container Regist… Read More
  • [NETCore] ASP.NET Core 中加入 API 版本控制前言 在開發 API 時可能會因為代碼調整或是架構的演進,相同的 API 接口可能會有新的版本出現,為了不影響舊的呼叫端程式邏輯運作,就需要在代碼中加上新舊版本的對應來解決 API 版本問題,或許為了解決 API 版本問題可以有很多種不同的解法,在 ASP.NET Core 中可以透過  Microsoft.AspNetCore.Mvc.Versioning  來解決此問題,這篇就來分享一下有關M… Read More
  • [NETCore] ASP.NET Core 中的例外處理方式前言 錯誤處理一直是開發中的重要環節之一,如果在程式發生異常錯誤的當下有效的將錯誤訊息完整的記錄下來,可以大大的節省 debug 的時間與效率,反過來如果在開發時沒有考慮到異常處理的機制,可能在發生問題時要找到錯誤的原因難度就會提高,因此在開發時必須要考慮到異常處理的機制,過去公司都會將 exception 訊息透過推(push)或是拉(pull)的方式傳送到 Logstash 再搭配 Elasticsearch 與 Kibana 搜尋到相對… Read More
  • [NETCore] ASP.NET Core 使用強型別取代 IOption 注入配置前言 之前的 如何取得 appsettings.json 組態設定 文章中有介紹在 ASP.NET Core 中透過 IOptions 方法取得設定檔的方法,在需要用到的地方注入 IOptions 取得設定類別的資訊,相信使用上並不困難在 MSDN 官方推薦作法也是如此,但如果開發一陣子之後可以發現到處都是 IOptios 類別,這篇文章介紹如何使用擴充 IServiceCollection 的方法來降低對 IOptios 的… Read More

0 意見:

張貼留言

Copyright © 2025 m@rcus 學習筆記 | Powered by Blogger

Design by Anders Noren | Blogger Theme by NewBloggerThemes.com