摘要:Hangfire 是一个开源的 .NET 任务调度框架,它允许开发人员轻松地将长时间运行的任务、定时任务和其他后台处理从主线程中分离出来,以提高应用程序的响应速度和性能
Hangfire 是一个开源的 .NET 任务调度框架,它允许开发人员轻松地将长时间运行的任务、定时任务和其他后台处理从主线程中分离出来,以提高应用程序的响应速度和性能
首先,需要一个 ASP.NET Core 项目。通过 NuGet 安装 Hangfire:
Install-Package Hangfire同时,根据需要安装 Hangfire 支持的数据库驱动,例如 SQL Server 或 Redis。
在Startup.cs文件中配置 Hangfire:publicvoidConfigureServices(IServiceCollection services){
// 添加 Hangfire 服务,并配置使用 SQL Server 作为持久化存储
services.AddHangfire(x => x.UseSqlServerStorage("connection_string"));
// 添加 Hangfire 服务器,后台处理任务的核心服务
services.AddHangfireServer;
}
publicvoidConfigure(IApplicationBuilder app, IBackgroundJobClient backgroundJobs)
{
// 使用 Hangfire Dashboard,允许在浏览器中查看任务的执行情况
app.UseHangfireDashboard;
// 创建一个 Fire-and-forget 类型的后台任务,即立即执行一次
backgroundJobs.Enqueue( => Console.WriteLine("Hello Hangfire!"));
}
• 立即执行的任务(Fire-and-forget):
varbackgroundJobs = app.Services.GetService;// 解析服务并使用
// 创建一个 Fire-and-forget 类型的后台任务,即立即执行一次
backgroundJobs.Enqueue( =>
Console.WriteLine("Hello Hangfire!,后台任务,即立即执行一次"));
• 延迟任务(Delayed jobs):
// 延迟任务,1 分钟后执行backgroundJobs.Schedule( =>
Console.WriteLine("延迟任务,1 分钟后执行"),
TimeSpan.FromMinutes(1));
• 周期性任务(Recurring jobs):
//周期性任务,每天执行一次RecurringJob.AddOrUpdate("easyjob", =>
Console.WriteLine("Easy!:周期性任务,每天执行一次"),
Cron.Daily);
//周期性任务 ,corn表达式
RecurringJob.AddOrUpdate("powerfuljob",
=> Console.WriteLine("Powerful!,周期性任务:每秒执行一次"),
"0/1 * * * * ? "); //每秒执行一次【https://cron.ciding.cc】
app.UseHangfireDashboard;
配置完成后,你可以通过访问
来查看 Hangfire Dashboard,监控任务的执行情况。
在生产环境中,你需要为 Hangfire Dashboard 设置权限验证。可以通过实现IDashboardAuthorizationFilter接口来自定义授权逻辑。Install-Package Hangfire.Dashboard.AuthorizationpublicclassBasedAuthorizationFilter:IDashboardAuthorizationFilter{
publicboolAuthorize([Not] Hangfire.Dashboard.DashboardContext context)
{
if(context.GetHttpContext.Request.Host.ToString.StartsWith("localhost"))
{
returntrue;
}
// 检查 context 参数是否为
if(context == )
{
thrownewArgumentException(nameof(context));
}
// 获取当前请求的用户标识
varhttpContext = context.GetHttpContext;
varauthUser = httpContext?.User;
// 这里可以根据需要实现具体的授权逻辑
// 检查用户是否在某个角色内,或者是否有特定的权限标记
bool isAuthorized = authUser?.Identity?.IsAuthenticated == true
&& authUser.IsInRole("YourRoleName"); // 替换 "YourRoleName" 为实际的角色名称
returnisAuthorized;
}
}
app.UseHangfireDashboard("/hangfire",newDashboardOptions
{
Authorization =newList {newBasedAuthorizationFilter }
}); // 设置 Dashboard 的 URL
Hangfire.HttpJob 是一个扩展组件,它允许将 Hangfire 的任务调度和业务逻辑分离。这意味着业务逻辑可以作为独立的 Web API 暴露给 Hangfire 进行调度,从而实现解耦。下面是一些关键点:
• 项目地址:Hangfire.HttpJob GitHub。
• 目的:剥离 Job 调度和业务,使得业务开发者可以忽略 Hangfire 的存在,不同业务线可以独立部署 Job 代理,互不影响。
• 技术特性:支持延迟任务、周期性任务、任务管理、Cron 生成器和任务代理扩展。
• 应用场景:适用于定时任务、后台作业、周期性任务和微服务架构中的任务调度。
来源:opendotnet
免责声明:本站系转载,并不代表本网赞同其观点和对其真实性负责。如涉及作品内容、版权和其它问题,请在30日内与本站联系,我们将在第一时间删除内容!