Hangfire 是一個(gè)開(kāi)源的 .NET 任務(wù)調(diào)度框架,它允許開(kāi)發(fā)人員輕松地將長(zhǎng)時(shí)間運(yùn)行的任務(wù)、定時(shí)任務(wù)和其他后臺(tái)處理從主線程中分離出來(lái),以提高應(yīng)用程序的響應(yīng)速度和性能
1. 安裝 Hangfire
首先,需要一個(gè) ASP.NET Core 項(xiàng)目。通過(guò) NuGet 安裝 Hangfire:
Install-Package Hangfire
同時(shí),根據(jù)需要安裝 Hangfire 支持的數(shù)據(jù)庫(kù)驅(qū)動(dòng),例如 SQL Server 或 Redis。
2. 配置 Hangfire
在 Startup.cs
文件中配置 Hangfire:
public void ConfigureServices(IServiceCollection services)
{
services.AddHangfire(x => x.UseSqlServerStorage("connection_string"));
services.AddHangfireServer();
}
public void Configure(IApplicationBuilder app, IBackgroundJobClient backgroundJobs)
{
app.UseHangfireDashboard();
backgroundJobs.Enqueue(() => Console.WriteLine("Hello Hangfire!"));
}
3. Hangfire 的任務(wù)類(lèi)型
- 立即執(zhí)行的任務(wù)(Fire-and-forget):
var backgroundJobs = app.Services.GetService<IBackgroundJobClient>();
backgroundJobs.Enqueue(() =>
Console.WriteLine("Hello Hangfire!,后臺(tái)任務(wù),即立即執(zhí)行一次"));
backgroundJobs.Schedule(() =>
Console.WriteLine("延遲任務(wù),1 分鐘后執(zhí)行"),
TimeSpan.FromMinutes(1));
- 周期性任務(wù)(Recurring jobs):
RecurringJob.AddOrUpdate("easyjob", () =>
Console.WriteLine("Easy!:周期性任務(wù),每天執(zhí)行一次"),
Cron.Daily);
RecurringJob.AddOrUpdate("powerfuljob",
() => Console.WriteLine("Powerful!,周期性任務(wù):每秒執(zhí)行一次"),
"0/1 * * * * ? ");
4. 訪問(wèn) Hangfire Dashboard
app.UseHangfireDashboard();
配置完成后,你可以通過(guò)訪問(wèn) http://localhost:5000/hangfire
來(lái)查看 Hangfire Dashboard,監(jiān)控任務(wù)的執(zhí)行情況。
5. 安全性
在生產(chǎn)環(huán)境中,你需要為 Hangfire Dashboard 設(shè)置權(quán)限驗(yàn)證。可以通過(guò)實(shí)現(xiàn) IDashboardAuthorizationFilter
接口來(lái)自定義授權(quán)邏輯。
Install-Package Hangfire.Dashboard.Authorization
public class BasedAuthorizationFilter : IDashboardAuthorizationFilter
{
public bool Authorize([NotNull] Hangfire.Dashboard.DashboardContext context)
{
if (context.GetHttpContext().Request.Host.ToString().StartsWith("localhost"))
{
return true;
}
if (context == null)
{
throw new ArgumentNullException(nameof(context));
}
var httpContext = context.GetHttpContext();
var authUser = httpContext?.User;
bool isAuthorized = authUser?.Identity?.IsAuthenticated == true
&& authUser.IsInRole("YourRoleName");
return isAuthorized;
}
}
app.UseHangfireDashboard("/hangfire", new DashboardOptions
{
Authorization = new List<IDashboardAuthorizationFilter> { new BasedAuthorizationFilter() }
});
6. Hangfire 擴(kuò)展:HttpJob
Hangfire.HttpJob 是一個(gè)擴(kuò)展組件,它允許將 Hangfire 的任務(wù)調(diào)度和業(yè)務(wù)邏輯分離。這意味著業(yè)務(wù)邏輯可以作為獨(dú)立的 Web API 暴露給 Hangfire 進(jìn)行調(diào)度,從而實(shí)現(xiàn)解耦。下面是一些關(guān)鍵點(diǎn):
- 項(xiàng)目地址:Hangfire.HttpJob GitHub。
- 目的:剝離 Job 調(diào)度和業(yè)務(wù),使得業(yè)務(wù)開(kāi)發(fā)者可以忽略 Hangfire 的存在,不同業(yè)務(wù)線可以獨(dú)立部署 Job 代理,互不影響。
- 技術(shù)特性:支持延遲任務(wù)、周期性任務(wù)、任務(wù)管理、Cron 生成器和任務(wù)代理擴(kuò)展。
- 應(yīng)用場(chǎng)景:適用于定時(shí)任務(wù)、后臺(tái)作業(yè)、周期性任務(wù)和微服務(wù)架構(gòu)中的任務(wù)調(diào)度。
7. 其他資源
轉(zhuǎn)自https://www.cnblogs.com/netcore5/p/18596996
該文章在 2024/12/11 8:32:22 編輯過(guò)