任务调度-hangfire

6 篇文章 0 订阅
1 篇文章 0 订阅

一、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

运行效果

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

再次运行 

 

三、配置后台任务

代码如下(示例):

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

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

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

builder.Services.AddScoped<IMessage, MessageService>();

1.在后台中调用方法

 只执行一次

代码如下(示例):

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

2.调用延时方法

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

代码如下(示例):

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

3.执行周期性任务

每间隔一段时间去执行 

代码如下(示例):

//每2秒执行一次
RecurringJob.AddOrUpdate<IMessage>("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()


    );

运行效果:

2.创建周期任务

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

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.创建只读面板

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

代码如下(示例):

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

  • 16
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
.NET Core 任务调度是一种在.NET Core 平台上实现任务调度的技术。任务调度可以用于定时执行一些重复性的任务,如定时发送邮件、生成报表等,也可以用于异步执行一些耗时的操作,如定时清理临时文件、定时更新数据等。 在.NET Core 中,可以使用多种方式来实现任务调度。一种常用的方式是使用第三方的任务调度库,如Quartz.NETHangfire等。这些库通常提供了灵活的任务调度功能,可以按照设定的时间间隔或特定的时间点来执行任务,并且支持任务的持久化存储和监控。 另一种方式是使用.NET Core 自带的定时器类来实现任务调度。在.NET Core 中,可以使用System.Threading.Timer类或System.Timers.Timer类来创建定时器,并在指定的时间间隔或时间点触发回调函数进行相应的任务处理。这些定时器类提供了简单的操作接口,可以满足一些简单的任务调度需求。 在使用.NET Core 实现任务调度时,需要考虑以下几个方面。首先,需要确定任务的执行频率和执行时间点,选择合适的任务调度方式。其次,需要考虑任务的并发性和可靠性,选择适当的任务调度库或定时器类。再次,需要考虑任务的持久化存储和监控,以便进行任务的管理和监控。最后,需要保证任务的处理逻辑是可靠的,能够处理异常情况和错误。 总之,.NET Core 任务调度是一种在.NET Core 平台上实现任务调度的技术,可以帮助我们实现定时执行和异步执行任务的需求。选择合适的任务调度方式,并注意任务的并发性、可靠性和处理逻辑,可以确保任务调度的有效运行。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值