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