任务调度-hangfire

news2025/1/16 20:55:25

目录

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

运行效果

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1340531.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【《设计模式之美》】如何取舍继承与组合

文章目录 什么情况下不推荐使用继承&#xff1f;组合相比继承有哪些优势&#xff1f;使用组合、继承的时机 本文主要想了解&#xff1a; 为什么组合优于继承&#xff0c;多用组合少用继承。如何使用组合来替代继承哪些情况适用继承、组合。有哪些设计模式使用到了继承、组合。 …

腾讯云轻量应用服务器和云服务器有什么不同?

腾讯云轻量服务器和云服务器CVM该怎么选&#xff1f;不差钱选云服务器CVM&#xff0c;追求性价比选择轻量应用服务器&#xff0c;轻量真优惠呀&#xff0c;活动 https://curl.qcloud.com/oRMoSucP 轻量应用服务器2核2G3M价格62元一年、2核2G4M价格118元一年&#xff0c;540元三…

linux ext3/ext4文件系统(part1格式化)

ext4文件系统结构 ext3的代码已经在v4.3被删除掉了&#xff08;ARM: tegra: Rebuild default configuration on v4.3-rc1 torvalds/linux241e077 GitHub&#xff09; ext4格式化的代码可以参考e2fsprogs的实现&#xff1a;mke2fs.c 格式化后的文件系统结构如下图&#xf…

AI绘图软件,科技之旅绘画

科技与艺术的碰撞总能产生令人惊叹的火花&#xff0c;现在小编要给大家介绍一款引领未来艺术潮流的AI绘图软件——首助编辑高手。这是一款将人工智能与创意绘画完美结合的软件&#xff0c;它将为你打开一扇全新的创意之门。 所需工具&#xff1a; 一个【首助编辑高手】软件 …

mysql原理---InnoDB统计数据是如何收集的

以下聚焦于 InnoDB 存储引擎的统计数据收集策略。 1.两种不同的统计数据存储方式 InnoDB 提供了两种存储统计数据的方式&#xff1a; (1). 永久性的统计数据 这种统计数据存储在磁盘上&#xff0c;也就是服务器重启之后这些统计数据还在。 (2). 非永久性的统计数据 这种统计数…

❀My学习小记录之算法❀

目录 算法:) 一、定义 二、特征 三、基本要素 常用设计模式 常用实现方法 四、形式化算法 五、复杂度 时间复杂度 空间复杂度 六、非确定性多项式时间&#xff08;NP&#xff09; 七、实现 八、示例 求最大值算法 求最大公约数算法 九、分类 算法:) 一、定义 …

Smartbi获工信部旗下赛迪网“2023行业信息技术应用创新产品”奖

近日&#xff0c;由工信部旗下的赛迪网、《数字经济》杂志共同主办的2023行业信息技术应用创新大会上&#xff0c;“信息技术应用创新成果名单”重磅揭晓&#xff0c;思迈特软件凭借“Smartbi 自然语言分析引擎”斩获“2023行业信息技术应用创新产品”大奖。 据了解&#xff0c…

codellama模型部署(待补充)

codellama介绍 Code Llama 是一个基于Llama 2的大型代码语言模型系列&#xff0c;在开放模型、填充功能、对大输入上下文的支持以及编程任务的零样本指令跟踪能力中提供最先进的性能。我们提供多种风格来覆盖广泛的应用程序&#xff1a;基础模型 (Code Llama)、Python 专业化 …

【String str = new String(“AAA“) 创建了几个对象?】

✅典型解析 创建的对象数应该是1个或者2个。 首先要清楚什么是对象? Java是一种面向对象的语言&#xff0c;而Java对象在JVM中的存储也是有一定的结构的&#xff0c;在HotSpot虚机中&#xff0c;存储的形式就是oop-klass model&#xff0c;即ava对象模型。我们在Java代码中&am…

Vue框架引入Axios

首先已经创建好了 Vue 框架&#xff0c;安装好了 node.js。 没有完成的可按照此博客搭建&#xff1a;搭建Vue项目 之后打开终端&#xff0c;使用命令。 1、命令安装 axios 和 vue-axios npm install axios --save npm install vue-axios --save2、package.json 查看版本 在 p…

Binder系列-service_manager.c

1. service_manager的任务 open 驱动告诉驱动&#xff0c;它是“servicemanager”在一个循环里 从驱动读取数据 解析数据 调用&#xff0c;根据code执行注册服务或者获取服务 &#xff08;图来自韦老师的视频&#xff09; 2.代码流程 2.1.open驱动 //framework…

elasticsearch列一:索引模板的使用

概述 近期一直在负责es这块&#xff0c;就想着和大家分享一些使用经验&#xff0c;我们从存储、查询、优化、备份、运维等几个方面来做分享。今天咱们先看下如何更加合理的存储数据。 初见索引模板 记得刚接触es还是18年那会&#xff0c;项目上线后因一些原因导致日志这部分的…

深入理解JVM虚拟机第三十二篇:详解JVM当中本地方法栈

😉😉 欢迎加入我们的学习交流群呀! ✅✅1:这是孙哥suns给大家的福利! ✨✨2:我们免费分享Netty、Dubbo、k8s、Mybatis、Spring等等很多应用和源码级别的高质量视频和笔记资料,你想学的我们这里都有! 🥭🥭3:QQ群:583783824 📚📚 工作VX:BigTreeJava 拉你…

059:vue中使用 AJAX来读取来自XML文件的信息

第059个 查看专栏目录: VUE ------ element UI 专栏目标 在vue和element UI联合技术栈的操控下&#xff0c;本专栏提供行之有效的源代码示例和信息点介绍&#xff0c;做到灵活运用。 &#xff08;1&#xff09;提供vue2的一些基本操作&#xff1a;安装、引用&#xff0c;模板使…

SpreadJS 集成使用案例

SpreadJS 集成案例 介绍&#xff1a; SpreadJS 基于 HTML5 标准&#xff0c;支持跨平台开发和集成&#xff0c;支持所有主流浏览器&#xff0c;无需预装任何插件或第三方组件&#xff0c;以原生的方式嵌入各类应用&#xff0c;可以与各类后端技术框架相结合。SpreadJS 以 纯前…

Python之路:网络工程师的自动化进阶(第2版)

&#x1f482; 个人网站:【 海拥】【神级代码资源网站】【办公神器】&#x1f91f; 基于Web端打造的&#xff1a;&#x1f449;轻量化工具创作平台&#x1f485; 想寻找共同学习交流的小伙伴&#xff0c;请点击【全栈技术交流群】 I. 引言 随着网络技术的不断发展&#xff0c;…

H5向微信小程序发送信息(小程序web-view打开H5)

引入weixin-js-sdk npm i weixin-js-sdk 页面引入 // 引入wxjsimport wx from "weixin-js-sdk"; 点击触发方法 methods: {goweap(id){console.log(wx);// H5传递数据 &#xff08;navigateBack&#xff09;wx.miniProgram.navigateBack({delta: 1});wx.min…

混沌工程的核心原则是什么?

在软件开发和系统运维领域&#xff0c;一种新兴的实践逐渐崭露头角&#xff0c;那就是混沌工程。混沌工程的核心理念是通过有计划的、控制的实验引入混沌&#xff0c;以验证和改善系统的稳健性。本文将介绍混沌工程的定义及核心原则是什么! 什么是混沌工程? 混沌工程是一种系统…

【理论】STM32定时器时间计算公式 +【实践】TIM中断1s计时一次

前言&#xff1a;定时器TIM的详细知识点见我的博文&#xff1a;11.TIM定时中断-CSDN博客 STM32定时器时间计算公式 公式解释&#xff1a; ARR&#xff08;TIM_Period&#xff09;&#xff1a;自动重装载值&#xff0c;是定时器溢出前的计数值 PSC&#xff08;TIM_Prescaler&…

k8s的二进制部署(源码包部署)

实验条件&#xff1a; 主机名 IP地址 组件 作用 master01 20.0.0.17 kube-apiserver、kube-controller-manager、kube-scheduler、etcd k8s部署 master02 20.0.0.27 kube-apiserver、kube-controller-manager、kube-scheduler node01 20.0.0.37 kubelet、kube-pro…