[C#] 在 .NET6 使用 Coravel 進行排程工作

在現代的應用程式開發中,執行定期任務或排程任務是一個常見的需求。這些任務可能包括資料庫清理、電子郵件發送、資料同步等。

Coravel 是一個輕量級的開源專案,提供了包括排程、貯列、郵件等功能,是一個功能豐富且易於使用的管理工具,讓開發人員能夠輕鬆地建立可靠的排程系統。本篇文章將介紹如何使用 .NET 6 和 Coravel 進行排程的應用程式開發,以提升效率並有效管理排程任務。

建立.NET6專案

本次範例使用 .NET6 Worker Service 專案進行,這樣後期可以視需求打包成 Windows Service 在背景進行排程工作 (可以參考文章:用.Net 6 Worker 開發 Windows Service) 。

打開 Visual Studio 或任何適用的編輯器,選擇建立新的專案,並選擇「Worker」範本。這將建立一個基本的 Worker Service 專案結構,包含 Program.cs 和 Worker.cs 檔案

安裝 Coravel

使用 command 或是 Nuget 套件管理員找到 Coravel 套件並安裝。

使用Nuget管理員安裝 Coravel

設定排程管理器

在 Program.cs 中 註冊排程,透過 AddScheduler()AddTransient() 來註冊排程類別,並在 UseScheduler 中設定排程執行的頻率。

using Coravel;

IHost host = Host.CreateDefaultBuilder(args)

    .ConfigureServices(services =>
    {
        //使用Coravel排程
        services.AddScheduler();
        //註冊排程任務
        services.AddTransient<Worker>();
    })
    .Build();

host.Services.UseScheduler(scheduler =>
{
    //設定排程在當地時間17:20執行
    scheduler.Schedule<Worker>().DailyAt(17,20).Zoned(TimeZoneInfo.Local)

});

Coravel內建了很多常用的時間頻率,不需要在寫傳統的Cron表達式,非常方便,以下為以些常見的範例:

  • 在第一次啟動服務時先執行一次
    scheduler.Schedule<Worker>().EverySeconds().RunOnceAtStart();
  • 每三秒鐘執行一次
    scheduler.Schedule<Worker>().EverySeconds(3);
  • 每五分鐘執行一次
    scheduler.Schedule<Worker>().EveryFiveMinutes();
  • 每小時執行一次
    scheduler.Schedule<Worker>().Hourly();
  • 每小時的第N分執行一次
    scheduler.Schedule<Worker>().Hourly(N);
  • 每個星期一的五點執行一次
    scheduler.Schedule<Worker>().DailyAtHour(5).Monday();
  • 使用Cron表達式
    scheduler.Schedule<Worker>().Cron("* * * * *");

更多的時間間隔範例可參考官方文件

要使用 Coravel 排程的類別需實作 Invocable , 代表一個個獨立的任務,可以在Invoke() 中編寫主要邏輯。

public class Worker : IInvocable
{
    private readonly ILogger _logger;

    public Worker(ILogger<Worker> logger)
    {
        _logger = logger;
    }

    public async Task Invoke()
    {

         //主要邏輯
         _logger.LogInformation("Triggered");
    }
}

參考資料

Coravel 官方文件

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *