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 个字段组成,它们按照以下顺序描述了任务的执行计划:
- 秒(0-59)
- 分钟(0-59)
- 小时(0-23)
- 天(1-31)
- 月份(1-12)或月份的别名(如 JAN、FEB、MAR 等)
- 星期几(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 中的简单实现。延迟执行作业只会执行一次、周期性作业按照预定的时间间隔重复执行