任务调度-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

运行效果

3.权限控制

安装Hangfire.Dashboard.BasicAuthorization包

代码如下(示例):

string hangfireStartUpPath = "/hangfire";
app.UseHangfireDashboard(hangfireStartUpPath, new DashboardOptions
{Authorization = new[] {new BasicAuthAuthorizationFilter(new BasicAuthAuthorizationFilterOptions{RequireSsl = false,       // 是否需要SSL连接,默认为falseSslRedirect = false,      // 是否启用SSL重定向,默认为falseLoginCaseSensitive = 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://xiahunao.cn/news/2659884.html

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

相关文章

Oracle 12c rac 搭建 dg

环境 rac 环境 &#xff08;主&#xff09;byoradbrac 系统版本&#xff1a;Red Hat Enterprise Linux Server release 6.5 软件版本&#xff1a;Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit byoradb1&#xff1a;172.17.38.44 byoradb2&#xff1a;…

用轻量级ORM--Dapper实现泛型仓储

阅读本文你的收获 了解Dapper的适用场景了解Dapper的本质其实是一些扩展方法学会使用Dapper的扩展Domel来实现泛型仓储 一、什么是Dapper&#xff1f; Dapper是一个轻量级的ORM&#xff08;对象关系映射&#xff09;工具&#xff0c;用于简化数据库操作。它和Entity Framewor…

第五章 与HTTP协作的Web服务器

5.1 用单台虚拟主机实现多个域名 在传统的基于IP地址的服务器配置中&#xff0c;一台服务器通常只能提供一个域名的服务。然而&#xff0c;通过虚拟主机的技术&#xff0c;同一台服务器可以根据请求中的域名&#xff0c;区分并提供不同的网站内容。这使得在一台物理或虚拟服务…

如何在Mac中设置三指拖移,这里有详细步骤

三指拖移手势允许你选择文本&#xff0c;或通过在触控板上用三指拖动窗口或任何其他元素来移动它。它可以用于快速移动或调整窗口、文件或图像在屏幕上的位置。 然而&#xff0c;这个手势在默认情况下是禁用的&#xff0c;因此在本教程中&#xff0c;我们将向你展示如何在你的…

Java—Throwing Exceptions

一、指定方法引发的异常 上一节展示了如何为ListOfNumbers类中的writeList&#xff08;&#xff09;方法编写异常处理程序。有时&#xff0c;代码捕获可能在其中发生的异常是适当的。然而&#xff0c;在其他情况下&#xff0c;最好让调用堆栈更上层的方法处理该异常。例如&…

DRF从入门到精通六(排序组件、过滤组件、分页组件、异常处理)

文章目录 一、排序组件继承GenericAPIView使用DRF内置排序组件继承APIView编写排序 二、过滤组件继承GenericAPIView使用DRF内置过滤器实现过滤使用第三方模块django-filter实现and关系的过滤自定制过滤类排序搭配过滤使用 三、分页组件分页器一&#xff1a;Pagination&#xf…

web3方向产品调研

每次互联网形态的改变&#xff0c;都会对世界产生很大的影响&#xff0c;上一次对社会产生重大影响的互联网形态&#xff08;Web2.0&#xff09;催生了一批改变人类生活和信息交互方式的企业。 目录 概述DAO是什么&#xff1f;为什么我们需要DAO? 金融服务金融桥接及周边服务D…

Go 中有效并发的模式

设计高效可靠的并发系统 在现代软件开发领域中&#xff0c;利用并发的能力已经变得至关重要。随着应用程序的复杂性增加和数据处理需求的增长&#xff0c;编写既高效又可靠的并发代码成为了一个重要的关注点。为了解决这个挑战&#xff0c;开发者们已经制定了一些模式和最佳实…

Kubeadmin实现k8s集群:

Kubeadmin来快速搭建一个k8s集群&#xff1a; 二进制搭建适合大集群&#xff0c;50台以上的主机&#xff0c; 但是kubeadm更适合中小企业的业务集群 环境&#xff1a; Master&#xff1a;20.0.0.71 2核4G 或者4核8G docker kubelet kubectl flannel Node1&#xff1a;20.…

【C语言】程序练习(二)

大家好&#xff0c;这里是争做图书馆扫地僧的小白。 个人主页&#xff1a;争做图书馆扫地僧的小白_-CSDN博客 目标&#xff1a;希望通过学习技术&#xff0c;期待着改变世界。 目录 前言 一、运算符练习 1 算术运算符 1.1 练习题&#xff1a; 2 自加自减运算符 3 关系运…

centos下docker安装Rocketmq总结,以及如何更换mq端口

默认你已经装好了docker哈 安装docker-compose sudo curl -L https://github.com/docker/compose/releases/download/1.25.1-rc1/docker-compose-uname -s-uname -m -o /usr/local/bin/docker-composechmod x /usr/local/bin/docker-composedocker-compose --version成功打印…

一招搞定找不到vcruntime140_1.dll无法继续执行此代码

在计算机使用过程中&#xff0c;我们经常会遇到一些错误提示&#xff0c;其中最常见的就是“找不到指定的模块”或“无法加载某某.dll文件”。而其中一个常见的问题就是vcruntime140_1.dll丢失。那么&#xff0c;vcruntime140_1.dll到底是什么&#xff1f;为什么会出现丢失的情…

MEMS热式气体流量传感器及其应用选型

热式气体流量传感器简介 热式气体流量传感器是基于流体传热学原理的一类传感器&#xff0c;利用 MEMS 热式原理对管路气体介质进行流量监测。 流量芯片由两个热偶堆和一个加热电阻组成&#xff0c;热偶堆对称分布在加热电阻的上、下游&#xff0c;加热电阻和热偶堆的热结处于一…

如何使用凹凸贴图和位移贴图制作逼真的模型

在线工具推荐&#xff1a; 3D数字孪生场景编辑器 - GLTF/GLB材质纹理编辑器 - 3D模型在线转换 - Three.js AI自动纹理开发包 - YOLO 虚幻合成数据生成器 - 三维模型预览图生成器 - 3D模型语义搜索引擎 本教程将解释如何应用这些效应背后的理论。在以后的教程中&#xff0…

腾讯云服务器怎么选?腾讯云服务器最新优惠价格表来了!

腾讯云服务器租用价格表&#xff1a;轻量应用服务器2核2G3M价格62元一年、2核2G4M价格118元一年&#xff0c;540元三年、2核4G5M带宽218元一年&#xff0c;2核4G5M带宽756元三年、轻量4核8G12M服务器446元一年、646元15个月&#xff0c;云服务器CVM S5实例2核2G配置280.8元一年…

Java中实现百度浏览器搜索功能(windows/linux)

要在Java中实现百度浏览器搜索功能&#xff0c;你可以使用Selenium WebDriver。Selenium是一个用于自动化浏览器的工具&#xff0c;WebDriver是Selenium的一个子项目&#xff0c;它提供了一套API&#xff0c;可以直接与浏览器交互。 依赖: <dependencies><dependency…

前端图片适配不同屏幕方案

预备知识&#xff1a; 设备独立像素,以下图的iphone12 Pro为例&#xff0c;390*844表示的就是设备独立像素&#xff08;DIP&#xff09;,也可以理解为CSS像素 物理像素&#xff08;设备像素&#xff09;&#xff0c;就是屏幕的分辨率&#xff0c;显示屏就是由一个个物理像素…

django之drf框架(排序、过滤、分页、异常处理)

排序 排序的快速使用 1.必须是继承GenericAPIView及其子类才能是用排序 导入OrderingFilter类&#xff0c;from rest_framework.filters import OrderingFilter 2.在类中配置类属性 filter_backends[OrderingFilter] 3.类中写属性 ordering_fields [price,id] # 必须是表的…

springboot整合minio做文件存储

一,minio介绍 MinIO 是一个基于Apache License v2.0开源协议的对象存储服务。它兼容亚马逊S3云存储服务接口&#xff0c;非常适合于存储大容量非结构化的数据&#xff0c;例如图片、视频、日志文件、备份数据和容器/虚拟机镜像等&#xff0c;而一个对象文件可以是任意大小&…

Android ImageView如何使用.svg格式图片

我们知道imageview常用的图片格式是.jpg/.png或者drawable里的部分.xml文件。但有时UI会给过来.svg格式的文件&#xff0c;下面讲解如何使用.svg格式图片文件 step1:AS点击File -> New -> Vector Asset step2:选中要使用的.svg文件&#xff0c;按需要命名和调整&#x…