.NET任务调度框架Hangfire使用教程

Hangfire 是一个强大的任务调度框架,可以轻松实现后台任务处理。它支持 .NET 和 .NET Core 项目,能够处理定时任务、延迟任务和持久化任务,适用于 Web 应用和微服务架构。

.NET任务调度框架Hangfire使用教程

Hangfire 官网:https://www.hangfire.io/

Hangfire GitHub地址:https://github.com/HangfireIO

以下是 Hangfire 的安装与使用教程,涵盖基础配置、任务类型和常见问题。

1. Hangfire 简介

Hangfire 的核心特点包括:

  • 支持持久化:任务状态可以存储在数据库中,即使应用程序崩溃也能恢复执行。
  • 多任务类型:支持即时任务、延迟任务和定时任务。
  • 分布式支持:可以在多个服务器上运行任务。
  • 内置仪表盘:可视化查看任务状态。

2. 安装 Hangfire

首先,需要一个 ASP.NET Core 项目。在项目中安装 Hangfire 和对应的数据库存储包(以 SQL Server 为例):

Install-Package Hangfire
Install-Package Hangfire.SqlServer

3. 配置 Hangfire

在 Startup.cs或者Program.cs 文件中配置 Hangfire:

using Hangfire;
using Hangfire.SqlServer;

var builder = WebApplication.CreateBuilder(args);

// 配置 Hangfire 使用 SQL Server 作为存储
builder.Services.AddHangfire(config =>
    config.SetDataCompatibilityLevel(CompatibilityLevel.Version_170)
          .UseSimpleAssemblyNameTypeSerializer()
          .UseDefaultTypeSerializer()
          .UseSqlServerStorage(builder.Configuration.GetConnectionString("HangfireConnection"), new SqlServerStorageOptions
          {
              CommandBatchMaxTimeout = TimeSpan.FromMinutes(5),
              SlidingInvisibilityTimeout = TimeSpan.FromMinutes(5),
              QueuePollInterval = TimeSpan.Zero,
              UseRecommendedIsolationLevel = true,
              DisableGlobalLocks = true
          }));

// 添加 Hangfire 服务
builder.Services.AddHangfireServer();

var app = builder.Build();

// 配置 Hangfire Dashboard
app.UseHangfireDashboard();

app.MapGet("/", () => "Hangfire Running!");

app.Run();

配置数据库连接

在 appsettings.json 文件中添加 Hangfire 数据库连接字符串:

"ConnectionStrings": {
    "HangfireConnection": "Server=your_server;Database=HangfireDB;User Id=your_user;Password=your_password;"
}

4. 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】

5. 访问 Hangfire Dashboard

app.UseHangfireDashboard();

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

.NET任务调度框架Hangfire使用教程

6. 安全性 Hangfire Dashboard 访问权限验证

在生产环境中,你需要为 Hangfire Dashboard 设置权限验证。可以通过实现 IDashboardAuthorizationFilter 接口来自定义授权逻辑。

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;
        }

        // 检查 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 的 URL
Hangfire 是一个强大的任务调度工具,通过简单的配置即可实现复杂的任务调度功能。它的持久化能力、可视化仪表盘和多任务类型让开发者能够轻松构建可靠的后台任务系统。根据项目需求,可以灵活选择任务类型,并利用分布式和多队列功能优化任务执行效率。
评论