Asp .Net Core 系列:Asp .Net Core 集成 Hangfire+MySQL

簡介

https://www.hangfire.io/

在 .NET 和 .NET Core 應用程序中執行後臺處理的簡單方法,無需 Windows 服務或單獨的進程。

Hangfire 是一個開源的.NET 任務調度框架,它提供了內置集成化的控制檯,允許用戶直觀明瞭地查看作業調度情況。Hangfire 不需要依賴於單獨的應用程序執行(如 Windows 服務或 Windows 計劃任務),支持持久性存儲,並且是開源且免費用於商業用途的。

Hangfire 的核心組件包括客戶端、持久化存儲和服務端。它基於隊列的任務處理機制,客戶端使用 BackgroundJob 類的靜態方法 Enqueue 來調用指定的方法或匿名函數,並將任務持久化到數據庫。一旦任務被持久化,Hangfire 服務端會立即從數據庫獲取相關任務並裝載到相應的 Job Queue 下進行處理。如果任務執行過程中沒有異常,則僅處理一次;若發生異常,Hangfire 提供了自動重試功能,異常及重試信息都會被記錄到數據庫中,用戶可以通過 Hangfire 控制面板查看這些信息。

Hangfire 適用於大多數.NET 平臺,包括.NET Framework 4.5 或更高版本、.NET Core 1.0 或更高版本,以及與.NET Standard 1.3 兼容的任何平臺。另一個關鍵組件 Hangfire Server 負責檢查持久存儲中排隊的後臺作業,並以可靠的方式執行它們。排隊作業由專用的工作線程池處理。

優點

  1. 簡單易用:Hangfire 提供了一個簡潔的 API,開發者只需要幾行代碼就可以完成任務的調度。例如,你可以使用BackgroundJob.Enqueue方法將任務加入隊列,使用BackgroundJob.Schedule方法來設定一個未來時間點執行的任務。
  2. 強大的任務調度能力:Hangfire 支持多種任務調度方式,包括定時任務、輪詢任務、一次性任務等。它還提供了靈活的任務調度策略,如固定間隔、輪詢等,可以滿足不同場景的需求。
  3. 可擴展性:Hangfire 可以很容易地集成到現有的.NET 應用程序中,並且可以與其他流行的.NET 庫和框架(如 Autofac、Ninject 等)一起使用。此外,Hangfire 支持基於隊列的任務處理,任務執行不是同步的,而是放到一個持久化隊列中,以便馬上把請求控制權返回給調用者。
  4. 任務持久化:Hangfire 提供了任務持久化的功能,確保任務在應用程序重啓後依然可以執行。這使得 Hangfire 在處理週期性任務或需要長時間運行的任務時非常可靠。
  5. 日誌和監控功能:Hangfire 提供了詳細的日誌和監控功能,便於開發者跟蹤和管理任務執行情況。這有助於開發者及時發現和解決問題,提高應用程序的穩定性和性能。
  6. 支持多種消息隊列:Hangfire 支持多種消息隊列,如 SQL Server、RabbitMQ 和 Redis 等,這爲用戶提供了更多的選擇和靈活性。

Asp .Net Core 集成 Hangfire+MySQL

1. 安裝必要的 NuGet 包

首先,你需要安裝 Hangfire 相關的 NuGet 包,以及 Hangfire 的 MySQL 存儲包。

使用 NuGet 包管理器控制檯 (Package Manager Console) 或 Visual Studio 的 NuGet 包管理器來安裝以下包:

Install-Package Hangfire.AspNetCore
Install-Package Hangfire.MySqlStorage

2. 配置 Hangfire 使用 MySQL 存儲

Startup.cs 文件的 ConfigureServices 方法中,配置 Hangfire 以使用 MySQL 作爲其後端存儲。

            builder.Services.AddHangfire(config =>
            {
                config.SetDataCompatibilityLevel(CompatibilityLevel.Version_180)
                      .UseSimpleAssemblyNameTypeSerializer()
                      .UseRecommendedSerializerSettings();

                config.UseStorage(
                          new MySqlStorage(
                              @"server=127.0.0.1;user=root;password=123456;database=hangfire;allowuservariables=True;",
                              //必須允許用戶自定義參數,不然面板不能使用
                              new MySqlStorageOptions()));
            });

           builder.Services.AddHangfireServer();
           builder.Services.AddTransient<IBackgroundJobClient, BackgroundJobClient>();

確保將 MySQL 連接字符串替換爲你自己的數據庫連接信息。

3. 配置 Hangfire Dashboard(可選)

如果你想使用 Hangfire Dashboard 來查看和管理後臺任務,你需要在 Configure 方法中添加相應的中間件。

app.UseHangfireDashboard();

現在,你可以通過訪問 /hangfire 路徑來查看 Hangfire Dashboard。

image

MisfireHandlingMode(失火處理模式)

  • Relaxed:默認模式。指定只創建一個後臺作業,不管錯過了多少次都不創建。後臺的“時間”參數作業將指向安排後臺作業的時間。
  • Strict:指定將爲每個錯過的事件創建新的後臺作業,並將“時間”參數設置爲相應的計劃時間。
  • Ignorable:指定不應在錯過的計劃中創建任何後臺作業,無論錯過的次數如何。

案例

即發即棄作業

WeatherForecast weather = new WeatherForecast();
BackgroundJob.Enqueue(() => HelloJob.Test4(weather));

延遲作業

BackgroundJob.Schedule(() => HelloJob.Test2("Test2"), TimeSpan.FromMinutes(1));

重複作業

            RecurringJob.AddOrUpdate("static-job", () => HelloJob.Test2(DateTime.Now.ToLongTimeString()), "0 * * * * ?", new RecurringJobOptions()
            {
                MisfireHandling = MisfireHandlingMode.Ignorable,
                TimeZone = TimeZoneInfo.Local,
            });

            RecurringJob.AddOrUpdate<IOCJob>("ioc-job", job => job.Test(), "0 * * * * ?");

延續作業

            var jobId = BackgroundJob.Enqueue(() => HelloJob.Test1());
            BackgroundJob.ContinueJobWith(jobId, () => HelloJob.Test2("Test3"));
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章