目录
一、Hangfire是什么?
二、配置服务
1.配置Hangfire服务
2.添加中间件
3.权限控制
三、配置后台任务
1.在后台中调用方法
2.调用延时方法
3.执行周期性任务
四、在客户端上配置任务
1.在AddHangfire添加UseHangfireHttpJob方法
2.创建周期任务
3.创建只读面板
总结
Hangfire是一个开源的.NET任务调度框架,提供了内置集成化的控制台,可以直观明了的查看作业调度情况,并且Hangfire不需要依赖于单独的应用程序执行。并且支持持久性存储。
Hangfire --基础包
Hangfire.Core --后台执行作业和任务调度
Hangfire.Sqlserver 数据库存储
代码如下(示例):
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 服务器
代码如下(示例):
#region 启用Hangfire仪表盘
app.UseHangfireDashboard();
#endregion
运行效果
安装Hangfire.Dashboard.BasicAuthorization包
代码如下(示例):
string hangfireStartUpPath = "/hangfire";
app.UseHangfireDashboard(hangfireStartUpPath, 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 = "123" // 管理员密码
}
}
})},
});
代码如下(示例):
public interface IMessage
{
void SendMessage(string msg);
}
public class MessageService : IMessage
{
public void SendMessage(string msg)
{
Console.WriteLine($"发送消息{msg}");
}
}
注册 IMessage 接口和对应的实现类
builder.Services.AddScoped();
只执行一次
代码如下(示例):
BackgroundJob.Enqueue("task1", x => x.SendMessage("我是任务1"));
过了多长时间以后,去执行
代码如下(示例):
BackgroundJob.Schedule("task2", x => x.SendMessage("我是任务2"), TimeSpan.FromMinutes(1)); //1分钟之后执行
每间隔一段时间去执行
代码如下(示例):
//每2秒执行一次
RecurringJob.AddOrUpdate("task3", x => x.SendMessage("我是任务3"), "0/2 * * * * *");
Hangfire.HttpJob包
是对Hangfire的一个扩展插件,利用Hangfire.HttpJob可以快速搭建分部署Job调度Server。
特点是:
业务与调度完全分离。
支持定点执行 延迟执行 周期性循环执行,支持秒级别
配合JobAgent组件可以实现Job管理 监控 日志等
代码如下(示例):
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 // 禁用全局锁定机制
}).UseHangfireHttpJob()
);
运行效果:
我们可以把定期要执行的接口放在上面去执行
json编辑器的参数说明如下
字段名称 | 备注 |
---|---|
JobName | 你给这个httpjob起的名称【必填项】 |
Method | 这个httpjob的请求方式 "get" 或者 "post" 【必填项】 |
ContentType | 这个httpjob的请求ContentType 默认"application/json" 【必填项】 |
Url | 这个httpjob的请求url 【必填项】 |
DelayFromMinutes | 需要延迟执行的分钟,注意:0 代表立刻执行; -1代表只能手动触发; >=1代表延迟分钟数 【必填项】 |
Data | 这个httpjob在Method=“post”的时候可以指定post的内容,可以是一个对象也可以是一个string或者其他类型 |
Timeout | 这个httpjob请求的超时时间(单位是毫秒 例如5000 代表是5秒) |
BasicUserName | 这个httpjob请求需要启用basic认证时设置的username |
BasicPassword | 这个httpjob请求需要启用basic认证时设置的密码 |
EnableRetry | 失败的时候(比如超时 远程服务器请求错误等)是否启用重试 默认false ,如果设置true 会重试最大3次 |
SendSucMail | 这个httpjob请求无异常的时候是否发送通知邮件 默认false |
SendFaiMail | 这个httpjob请求异常的时候是否发送通知邮件 默认true |
设置通知邮件地址 如果有多个用半角逗号隔开 | |
AgentClass | 如果是AgentJob开发的httpjob 则需要填写,填写的是完整的类型格式{namespace},{程序集的名称} 例如:TestHangfireAgent.Jobs,TestHangfireAgent |
不允许随意添加、修改任务,以及隐藏我们的数据库信息敏感信息
代码如下(示例):
var hangfireReadOnlyPath = "/hangfire-read";
//只读面板,只能读取不能操作
app.UseHangfireDashboard(hangfireReadOnlyPath, new DashboardOptions
{
IgnoreAntiforgeryToken = true,//这里一定要写true 不然用client库写代码添加webjob会出错
AppPath = hangfireStartUpPath,//返回时跳转的地址
DisplayStorageConnectionString = false,//是否显示数据库连接信息
IsReadOnlyFunc = Context => true
});
再次打开地址 http://localhost:5203/hangfire-read/recurring
hangfire界面上直观看到任务的执行情况,也可以单独部署可以跟我们的业务分开,用它很方便的执行我们定时批处理的任务。