.NET Core使用Hangfire 实现后台作业管理

947 阅读3分钟
  • 携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第1天,点击查看活动详情

Hangfire介绍

Hangfire 是一个开源的.NET Core的后台任务调度框架,无需 Windows 服务或单独的进程只需要简单的配置,以及简单的几行代码即可运行。

Hangfire他有哪些优势?

  • 持久化保存任务,默认存储在Sql Sever数据库中
  • 开源并且免费用于商业用途
  • 任务失败可以自动重新执行,并且支持设置重启次数,面板支持手动操作
  • 多种任务执行方式:如及发及弃、延迟执行、循环执行等
  • 无需执行手动存储清理,自动清洁删除旧纪录
  • 支持 MSMQRedis 扩展提升任务执行效率

业务场景

比如在OA系统里,需要实现每周五下午某一个时间点,提醒那些没有写周报的同事,给他们发送一封邮件,提醒他们按时填写周报。针对如上业务场景,我们就可以考虑使用Hangfire创建定时任务,在每周的周五定时发送提醒。

在.NET Core中使用

  • 安装NuGet包为 Hangfire

  • appsettings.json配置连接字符串

"ConnectionStrings": {
  "HangfireConnection": "Data Source=.;Initial Catalog=HangfireDemo;Integrated Security=True;"
}
  • 注册服务(.NET6没有StartUp直接配置在Program.cs类)

// Add Hangfire services.
builder.Services.AddHangfire(configuration => configuration
        .SetDataCompatibilityLevel(CompatibilityLevel.Version_170)
        .UseSimpleAssemblyNameTypeSerializer()
        .UseRecommendedSerializerSettings()
        .UseSqlServerStorage(builder.Configuration.GetConnectionString("HangfireConnection"), new SqlServerStorageOptions
        {
            CommandBatchMaxTimeout = TimeSpan.FromMinutes(5),
            SlidingInvisibilityTimeout = TimeSpan.FromMinutes(5),
            QueuePollInterval = TimeSpan.Zero,
            UseRecommendedIsolationLevel = true,
            DisableGlobalLocks = true
        }));

// Add the processing server as IHostedService
builder.Services.AddHangfireServer();
  • 配置仪表盘
app.UseHangfireDashboard();
  • 仪表盘访问限制

Hangfire是支持在仪表盘中删除,终止任务等操作的,所以访问限制也非常重要!官方提供了IDashboardAuthorizationFilter接口我们只需要实现该接口的Authorize方法用于允许或禁止请求,即可实现

public class HangfireAuthorization : IDashboardAuthorizationFilter
{
    public bool Authorize(DashboardContext context)
    {
        var httpContext = context.GetHttpContext();

        // ....
        // 在这里实现你的逻辑,比如特定角色,指定账户才能访问

        return true;
    }
}

// 要在其他身份验证之后
app.UseHangfireDashboard("/hangfire", new DashboardOptions
{
    Authorization = new[] { new HangfireAuthorization() }
});

配置完成后启动项目,通过 本地Ip/Hangfire 可以看到我们数据库已经将所有的数据库表结构迁移过来了,总共是11张表,用于持久化保存任务。注意: 数据库不会自动创建,需要手动添加,添加之后就会自动同步表结构。

image.png

实现一个定时任务

// 需要定时执行的任务类
public static class WeeklyNotificationTask
{
    public static void Execute() 
    {
        // 1.查找没有写周报的同事

        // 2.发送邮件通知未写周报的人
        Console.WriteLine("执行Task");
    }
}

//调用 参数1是调用jobid 第二是委托需要执行的操作  第三个参数是规则支持Cron表达式
RecurringJob.AddOrUpdate("easyjob", () => WeeklyNotificationTask.Execute(), Cron.Weekly(DayOfWeek.Friday));

启动项目,我们可以在作业里面看到任务相关信息,由于我们设置的是每周五执行,但是面板上也提供了立即执行的操作!

image.png

image.png

总结

针对一些业务场景,使用后台任务能够提升用户体验。可以看出Hangfire上手还是非常简单的,使用门槛低,复杂性不高,给大家推荐一个在线Corn表达式生成器,让你的定时任务使用起来更加灵活。