English 简体中文 繁體中文 한국 사람 日本語 Deutsch русский بالعربية TÜRKÇE português คนไทย french
查看: 3|回复: 0

NET任务调度框架Hangfire使用指南

[复制链接]
查看: 3|回复: 0

NET任务调度框架Hangfire使用指南

[复制链接]
查看: 3|回复: 0

342

主题

0

回帖

1036

积分

金牌会员

积分
1036
zhidao

342

主题

0

回帖

1036

积分

金牌会员

积分
1036
2025-2-7 01:44:35 | 显示全部楼层 |阅读模式
Hangfire 是一个开源的 .NET 任务调度框架,它允许开发人员轻松地将长时间运行的任务、定时任务和其他后台处理从主线程中分离出来,以提高应用程序的响应速度和性能
1. 安装 Hangfire

首先,需要一个 ASP.NET Core 项目。通过 NuGet 安装 Hangfire:
Install-Package Hangfire同时,根据需要安装 Hangfire 支持的数据库驱动,例如 SQL Server 或 Redis。
2. 配置 Hangfire

在 Startup.cs 文件中配置 Hangfire:
public void ConfigureServices(IServiceCollection services){    // 添加 Hangfire 服务,并配置使用 SQL Server 作为持久化存储    services.AddHangfire(x => x.UseSqlServerStorage("connection_string"));    // 添加 Hangfire 服务器,后台处理任务的核心服务    services.AddHangfireServer();}public void Configure(IApplicationBuilder app, IBackgroundJobClient backgroundJobs){    // 使用 Hangfire Dashboard,允许在浏览器中查看任务的执行情况    app.UseHangfireDashboard();    // 创建一个 Fire-and-forget 类型的后台任务,即立即执行一次    backgroundJobs.Enqueue(() => Console.WriteLine("Hello Hangfire!"));}3. Hangfire 的任务类型


  • 立即执行的任务(Fire-and-forget)
  var backgroundJobs = app.Services.GetService<IBackgroundJobClient>(); // 解析服务并使用  // 创建一个 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】
4. 访问 Hangfire Dashboard

app.UseHangfireDashboard();
配置完成后,你可以通过访问 http://localhost:5000/hangfire 来查看 Hangfire Dashboard,监控任务的执行情况。

5. 安全性

在生产环境中,你需要为 Hangfire Dashboard 设置权限验证。可以通过实现 IDashboardAuthorizationFilter 接口来自定义授权逻辑。
Install-Package Hangfire.Dashboard.Authorizationpublic class BasedAuthorizationFilter : IDashboardAuthorizationFilter{     public bool Authorize([NotNull] Hangfire.Dashboard.DashboardContext context)    {        if (context.GetHttpContext().Request.Host.ToString().StartsWith("localhost"))        {            return true;        }        // 检查 context 参数是否为 null        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"); // 替换 "YourRoleName" 为实际的角色名称        return isAuthorized;    } }  app.UseHangfireDashboard("/hangfire", new DashboardOptions {     Authorization = new List<IDashboardAuthorizationFilter> { new BasedAuthorizationFilter() } }); // 设置 Dashboard 的 URL6. Hangfire 扩展:HttpJob

Hangfire.HttpJob 是一个扩展组件,它允许将 Hangfire 的任务调度和业务逻辑分离。这意味着业务逻辑可以作为独立的 Web API 暴露给 Hangfire 进行调度,从而实现解耦。下面是一些关键点:

  • 项目地址Hangfire.HttpJob GitHub
  • 目的:剥离 Job 调度和业务,使得业务开发者可以忽略 Hangfire 的存在,不同业务线可以独立部署 Job 代理,互不影响。
  • 技术特性:支持延迟任务、周期性任务、任务管理、Cron 生成器和任务代理扩展。
  • 应用场景:适用于定时任务、后台作业、周期性任务和微服务架构中的任务调度。
7. 其他资源

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

342

主题

0

回帖

1036

积分

金牌会员

积分
1036

QQ|智能设备 | 粤ICP备2024353841号-1

GMT+8, 2025-3-10 15:25 , Processed in 1.257191 second(s), 30 queries .

Powered by 智能设备

©2025

|网站地图