ASP.NET CORE 6.0实现Hangfire

Hangfire介绍

Hangfire是一个.NET开发的开源库,用于在后台执行长时间运行的任务和作业调度。它提供了一个简单且易于使用的接口,可以用来处理异步任务、定时任务、重试任务等。

使用Hangfire可以将长时间运行的任务放在后台执行,而不会阻塞主要的应用程序进程。它通过使用后台线程池和持久化存储来保证任务的可靠执行,并提供了一个直观的仪表板,用于监视和管理任务的状态。

在.NET Core中,你可以使用Hangfire来管理和调度各种类型的任务,包括发送电子邮件、生成报表、批量处理数据等。它还支持任务的优先级、延迟执行、定时执行和重试机制,使得任务调度变得更加灵活和可靠。

总结起来,Hangfire是一个强大的任务调度库,可以帮助你更好地管理后台任务,提高应用程序的性能和可靠性。

步骤 1:添加 Hangfire 包
Hangfire.Core                                            --后台执行作业和任务调度

Hangfire.Sqlserver                                     --Sqlserver数据库存储

Hangfire.AspNetCore                                --AspNetCore支持

Hangfire.Dashboard.BasicAuthorization   --可视化+权限控制

Hangfire.HttpJob                                       --httpJob

步骤 2:配置 Hangfire
添加对 Hangfire 的配置。可以使用内存存储、SQL Server 存储、Redis 存储等作为 Hangfire 的后台存储。
appsettings.json添加数据库连接字符串

  "ConnectionStrings": {
    "HangfireConnection": "server=.;database=Hangfiredb;uid=sa;pwd=123456;TrustServerCertificate=true" //TrustServerCertificate跳过证书验证
  }
#region 配置Hangfire服务
builder.Services.AddHangfire(configuration => configuration
    .SetDataCompatibilityLevel(CompatibilityLevel.Version_170) // 设置数据兼容性级别为 1.7 版本
    .UseSimpleAssemblyNameTypeSerializer() // 使用简单的程序集名称类型序列化器
    .UseRecommendedSerializerSettings() // 使用推荐的序列化器设置
    .UseSqlServerStorage(builder.Configuration.GetConnectionString("HangfireConnection"), new SqlServerStorageOptions
    {
        CommandBatchMaxTimeout = TimeSpan.FromMinutes(5), // 批处理作业的最大超时时间为 5 分钟
        SlidingInvisibilityTimeout = TimeSpan.FromMinutes(5), // 作业的可见性超时时间为 5 分钟
        QueuePollInterval = TimeSpan.FromSeconds(5), // 检查作业队列的间隔时间为 5 秒
        UseRecommendedIsolationLevel = true, // 使用推荐的事务隔离级别
        DisableGlobalLocks = true // 禁用全局锁定机制
    }));

builder.Services.AddHangfireServer(); // 添加 Hangfire 服务器
#endregion
步骤 3:配置 Hangfire 路由,启用Hangfire仪表盘
#region 启用Hangfire仪表盘
app.UseHangfireDashboard("/hangfire", new DashboardOptions
{
    Authorization = new[] {new BasicAuthAuthorizationFilter(new BasicAuthAuthorizationFilterOptions
    {
        RequireSsl = false,       // 是否需要SSL连接,默认为false
        SslRedirect = false,      // 是否启用SSL重定向,默认为false
        LoginCaseSensitive = true, // 登录名是否区分大小写,默认为true
        //Users = new BasicAuthAuthorizationUser[] {},  //未设置登录凭据
        Users = new []
        {
            new BasicAuthAuthorizationUser
            {
                Login = "admin",      // 管理员登录名
                PasswordClear = "3edc#EDC"  // 管理员密码
            }
        }
    })},
    IsReadOnlyFunc = (context) => false  // 设置仪表盘为可写模式
});
#endregion

步骤 4:调度 Hangfire 作业

    public interface IMessageService
    {
        void SendMessage(string message);

        void ReceivedMessage(string message);
    }

    public class MessageService : IMessageService
    {
        public void ReceivedMessage(string message)
        {
            Console.WriteLine($"接收消息{message}");
        }

        public void SendMessage(string message)
        {
            Console.WriteLine($"发送消息{message}");
        }
    }
// 注册 IMessageService 接口和对应的实现类用于Hangfire作业
builder.Services.AddScoped<IMessageService, MessageService>();
#region Hangfire延时执行作业
BackgroundJob.Schedule<IMessageService>(x => x.SendMessage("Delayed Message"), TimeSpan.FromMinutes(5));
#endregion
#region Hangfire周期性作业
RecurringJob.AddOrUpdate<IMessageService>("sendMessageJob", x => x.SendMessage("Hello Message"), "0 2 * * *");
#endregion

"0 2 * * *" 是一个 Cron 表达式,用于设置一个每天的固定时间执行的周期性任务。
cronExpression 是一个基于 Cron 表达式的规则,用于配置周期性任务的执行计划。Cron 表达式是一种时间表达式语法,它允许你按照指定的时间模式来计划任务的执行。

Cron 表达式由空格分隔的 6 个字段组成,它们按照以下顺序描述了任务的执行计划:

  1. 秒(0-59)
  2. 分钟(0-59)
  3. 小时(0-23)
  4. 天(1-31)
  5. 月份(1-12)或月份的别名(如 JAN、FEB、MAR 等)
  6. 星期几(0-6)或星期几的别名(其中 0 和 7 都代表星期日)

除了这些基本字段外,Cron 表达式还支持一些特殊字符:

  • * 表示匹配字段的每个可能的值,例如使用 * 表示分钟字段时表示匹配 0-59 的每一分钟。
  • / 表示指定一个步长,例如 */5 表示每隔 5 个单位匹配一次。
  • , 表示列出多个值,例如 2,5,8 表示匹配 2、5 和 8 这三个值。
  • - 表示一个范围,例如 2-5 表示匹配 2 到 5 的所有值。

下面是一些常见的 Cron 表达式示例:

  • "0 * * * *":每小时的 0 分钟执行任务。
  • "0 0 * * *":每天的 0 点执行任务。
  • "30 8 * * 1-5":周一到周五的 8:30 执行任务。
  • "0 0 1-15 1 *":每个月的 1-15 号的 0 点执行任务。
  • "0 0 23 L *":每个月的最后一天的 23 点执行任务。

可以根据需要根据这些规则来定义和配置 Hangfire 的周期性任务。记得将 Cron 表达式写入 Hangfire 中的 AddOrUpdate 或 Cron 方法中,以便进行任务调度。

运行效果

关于 

这样就完成了 Hangfire 在 ASP.NET Core 中的简单实现。延迟执行作业只会执行一次、周期性作业按照预定的时间间隔重复执行

  • 14
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值