- 携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第1天,点击查看活动详情
Hangfire介绍
Hangfire 是一个开源的.NET Core的后台任务调度框架,无需 Windows 服务或单独的进程只需要简单的配置,以及简单的几行代码即可运行。
Hangfire他有哪些优势?
- 持久化保存任务,默认存储在Sql Sever数据库中
- 开源并且免费用于商业用途
- 任务失败可以自动重新执行,并且支持设置重启次数,面板支持手动操作
- 多种任务执行方式:如及发及弃、延迟执行、循环执行等
- 无需执行手动存储清理,自动清洁删除旧纪录
- 支持 MSMQ 或 Redis 扩展提升任务执行效率
业务场景
比如在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张表,用于持久化保存任务。注意: 数据库不会自动创建,需要手动添加,添加之后就会自动同步表结构。
实现一个定时任务
// 需要定时执行的任务类
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));
启动项目,我们可以在作业里面看到任务相关信息,由于我们设置的是每周五执行,但是面板上也提供了立即执行的操作!
总结
针对一些业务场景,使用后台任务能够提升用户体验。可以看出Hangfire上手还是非常简单的,使用门槛低,复杂性不高,给大家推荐一个在线Corn表达式生成器,让你的定时任务使用起来更加灵活。