任务调度-hangfire

目录

一、Hangfire是什么?

二、配置服务

1.配置Hangfire服务

2.添加中间件

3.权限控制

三、配置后台任务

1.在后台中调用方法

2.调用延时方法

3.执行周期性任务

四、在客户端上配置任务

1.在AddHangfire添加UseHangfireHttpJob方法

2.创建周期任务

3.创建只读面板

总结


一、Hangfire是什么?

Hangfire是一个开源的.NET任务调度框架,提供了内置集成化的控制台,可以直观明了的查看作业调度情况,并且Hangfire不需要依赖于单独的应用程序执行。并且支持持久性存储。

二、配置服务

Hangfire          --基础包

Hangfire.Core  --后台执行作业和任务调度

Hangfire.Sqlserver  数据库存储

1.配置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 服务器

2.添加中间件

代码如下(示例):

#region 启用Hangfire仪表盘
app.UseHangfireDashboard();
#endregion

运行效果

任务调度-hangfire_第1张图片

3.权限控制

安装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"  // 管理员密码
            }
        }
    })},
});

再次运行 任务调度-hangfire_第2张图片

 

三、配置后台任务

代码如下(示例):

    public interface IMessage
    {
        void SendMessage(string msg);
    }

    public class MessageService : IMessage
    {
        public void SendMessage(string msg)
        {
            Console.WriteLine($"发送消息{msg}");
        }
    }

 注册 IMessage 接口和对应的实现类

builder.Services.AddScoped();

1.在后台中调用方法

 只执行一次

代码如下(示例):

BackgroundJob.Enqueue("task1", x => x.SendMessage("我是任务1"));

2.调用延时方法

过了多长时间以后,去执行

代码如下(示例):

BackgroundJob.Schedule("task2", x => x.SendMessage("我是任务2"), TimeSpan.FromMinutes(1)); //1分钟之后执行

3.执行周期性任务

每间隔一段时间去执行 

代码如下(示例):

//每2秒执行一次
RecurringJob.AddOrUpdate("task3", x => x.SendMessage("我是任务3"), "0/2 * * * * *"); 

四、在客户端上配置任务

Hangfire.HttpJob包

是对Hangfire的一个扩展插件,利用Hangfire.HttpJob可以快速搭建分部署Job调度Server。
特点是:
业务与调度完全分离。
支持定点执行 延迟执行 周期性循环执行,支持秒级别
配合JobAgent组件可以实现Job管理 监控 日志等

代码如下(示例):

1.在AddHangfire添加UseHangfireHttpJob方法

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()


    );

运行效果:

任务调度-hangfire_第3张图片

2.创建周期任务

我们可以把定期要执行的接口放在上面去执行

任务调度-hangfire_第4张图片

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
Mail 设置通知邮件地址 如果有多个用半角逗号隔开
AgentClass 如果是AgentJob开发的httpjob 则需要填写,填写的是完整的类型格式{namespace},{程序集的名称} 例如:TestHangfireAgent.Jobs,TestHangfireAgent

 

3.创建只读面板

不允许随意添加、修改任务,以及隐藏我们的数据库信息敏感信息

任务调度-hangfire_第5张图片

代码如下(示例):

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_第6张图片


总结

hangfire界面上直观看到任务的执行情况,也可以单独部署可以跟我们的业务分开,用它很方便的执行我们定时批处理的任务。

你可能感兴趣的:(WebApi,.Net,core,Hangfire,.net,core)