.net Framework 4.6 WebAPI 使用Hangfire
C# 使用 Hangfire
第一章 .net Framework 4.6 WebAPI 使用Hangfire
文章目录
- C# 使用 Hangfire
- 前言
- 一、hangfire是什么?
- 二、hangfire的特点
- 三、.net Framework 中hangfire的使用方法
- 第一步:创建WebAPI控制器
- 第二步:添加nuget包
- 第三步 创建startup类
- 新建项目startup类
- Startup类中具体的实现
- 第四步:创建动态添加Job的WebApi
- 接口返回类型model
- 业务执行帮助方法
- 对外接口会用到的dll
- 创建对外接口
- 第五步:
- 无参业务接口
- 有参业务接口
- Get请求
- 控制面板参数配置
- 后端接口配置
- POST请求
- 控制面板参数配置
- 后端接口接收参数配置
- 第六步:控制面板手动添加周期性作业
- 访问hangfire控制面板
- 添加周期性作业参数说明
- 第七步:查看执行结果
- 执行成功效果图
- 执行失败效果图
- 任务回调校验失败错误
- 业务接口请求出现错误
- 业务接口请求超时
- 总结
前言
在业务中常常遇到需要在后台定时执行的业务,例如:库存同步、数据定时推送拉取等,目前较为成熟的定时任务插件主要有hangfire,Quartz;这里我们就选择hangfire,选择它的原因主要是因为它自带了控制面板,单它也有缺点它不支持秒级定时。这里举例的业务主要是做库存同步,不需要精确到秒级。下面咱们就来看看怎么实现吧。
一、hangfire是什么?
Hangfire 是一个开源且商业免费使用的工具函数库。可以让你非常容易地在 ASP.NET 应用(也可以不在 ASP.NET 应用)中执行多种类型的后台任务,而无需自行定制开发和管理基于 Windows Service 后台任务执行器。且任务信息可以被持久保存。内置提供集成化的控制台
二、hangfire的特点
-
支持基于队列的任务处理:任务执行不是同步的,而是放到一个持久化队列中,以便马上把请求控制权返回给调用者。使用方法:BackgroundJob.Enqueue (() => Console.WriteLine (“Simple!”));
-
延迟任务执行:不是马上调用方法,而是设定一个未来时间点再来执行。使用方法:BackgroundJob.Schedule (() => Console.WriteLine (“Reliable!”), TimeSpan.FromDays (7));
-
循环任务执行:只需要简单的一行代码就可以添加重复执行的任务,其内置了常见的时间循环模式,也可以基于 CRON 表达式来设定复杂的模式。使用方法:RecurringJob.AddOrUpdate (() => Console.WriteLine (“Transparent!”), Cron.Daily);
-
持久化保存任务、队列、统计信息:默认使用 SQL Server,也可以配合消息队列来降低队列处理延迟,或配置使用 Redis 来获得更好的性能表现
-
内置自动重试机制:可以设定重试次数,还可以手动在控制台重启任务
-
除了调用静态方法外还支持实例方法
-
能够捕获多语言状态:即可以把调用者的 Thread.CurrentCulture 和 Thread.CurrentUICulture 信息同任务持久保存在一起,以便任务执行的时候多语言信息是一致的
-
支持任务取消:使用 CancellationToken 这样的机制来处理任务取消逻辑
-
支持 IoC 容器:目前支持 Ninject 和 Autofac 比较常用的开源 IoC 容器
-
支持 Web 集群:可以在一台或多台机器上运行多个 Hangfire 实例以便实现冗余备份
-
支持多队列:同一个 Hangfire 实例可以支持多个队列,以便更好的控制任务的执行方式
-
并发级别的控制:默认是处理器数量的 5 倍工作行程,当然也可以自己设定
-
具备很好的扩展性:有很多扩展点来控制持久存储方式、IoC 容器支持等
三、.net Framework 中hangfire的使用方法
第一步:创建WebAPI控制器
第二步:添加nuget包
这里需要注意的是我使用的是1.8.3,目前最新版是1.8.14,最新版使用中文的时候会有点问题导致控制面单无法展示中文。
第三步 创建startup类
新建项目startup类
具体步骤如下:
1、右键项目
2、添加
3、新建项目
4、选择OWIN Startup类
Startup类中具体的实现
这里需要注意的是:
代码中zh-CN处是将控制面板设置为中文的方法,此方法在1.8.14中设置是没有效果的,具体原因不得而知。
public class Startup
{public void Configuration(IAppBuilder app){System.Threading.Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo("zh-CN");GlobalConfiguration.Configuration.UseLog4NetLogProvider().UseDefaultCulture(new CultureInfo("zh-CN")).SetDataCompatibilityLevel(CompatibilityLevel.Version_180).UseSimpleAssemblyNameTypeSerializer().UseRecommendedSerializerSettings().UseSqlServerStorage(数据库连接字符串, new SqlServerStorageOptions{QueuePollInterval = TimeSpan.FromSeconds(15),JobExpirationCheckInterval = TimeSpan.FromHours(1),CountersAggregateInterval = TimeSpan.FromMinutes(5),PrepareSchemaIfNecessary = true,DashboardJobListLimit = 50000,TransactionTimeout = TimeSpan.FromMinutes(1)//TablesPrefix = "Hangfire"}).UseHangfireHttpJob();app.UseHangfireDashboard();//配置后台仪表盘app.UseHangfireServer();//开始使用Hangfire服务}
}
第四步:创建动态添加Job的WebApi
接口返回类型model
public class ResponseDTO{public bool Status { get; set; }public string Message { get; set; }}
业务执行帮助方法
private ResponseDTO Excute(Hangfire.HttpJob.Server.HttpJobItem httpJob)
{ResponseDTO rspModel = new ResponseDTO();try{using (var client = new HttpClient()){if (httpJob.Headers != null && httpJob.Headers.Count > 0){foreach (var HeaderInfo in httpJob.Headers){client.DefaultRequestHeaders.Add(HeaderInfo.Key, HeaderInfo.Value);}}Dictionary<string, object> parames = new Dictionary<string, object>();if (!string.IsNullOrWhiteSpace(httpJob.Data)){parames = JsonConvert.DeserializeObject<Dictionary<string, object>>(httpJob.Data);}client
相关文章:

.net Framework 4.6 WebAPI 使用Hangfire
C# 使用 Hangfire 第一章 .net Framework 4.6 WebAPI 使用Hangfire 文章目录 C# 使用 Hangfire前言一、hangfire是什么?二、hangfire的特点三、.net Framework 中hangfire的使用方法第一步:创建WebAPI控制器第二步:添加nuget包第三步 创建startup类新建项目startup类Startu…...

两个向量所在平面的法线,外积,叉积,行列式
偶尔在一个数学题里面看到求两向量所在平面的法线,常规方法可以通过法线与两向量垂直这一特点,列两个方程求解;另外一种方法可以通过求解两个向量的叉积,用矩阵行列式 (determinant) 的方式,之前还没见过,在…...

C++之 友元重载 以及最常用的几种友元函数
在之前的友元中就曾经讲过,我们为了去访问修改私有成员中的数据时,只能通过公有的办法去进行访问操作,非常的局限。所以C引用了友元函数,只要加上friend关键字,C的这个类,会自动把这个函数的权限拉到类内&a…...
动态规划(3)——dp多状态问题Ⅰ
题一.按摩师(LeetCode) 题目描述 一个有名的按摩师会收到源源不断的预约请求,每个预约都可以选择接或不接。在每次预约服务之间要有休息时间,因此她不能接受相邻的预约。给定一个预约请求序列,替按摩师找到最优的预约集…...
在Mac电脑上安装adb环境
当你在命令行输入 adb version 或adb devices, 报错:zsh: command not found: adb ,那么说明你的 Mac 上没有安装 ADB(Android Debug Bridge),或者它没有添加到你的路径中。你可以按照以下步骤安装和配置 ADBÿ…...

分糖果C++
题目: 样例解释: 样例1解释 拿 k20 块糖放入篮子里。 篮子里现在糖果数 20≥n7,因此所有小朋友获得一块糖; 篮子里现在糖果数变成 13≥n7,因此所有小朋友获得一块糖; 篮子里现在糖果数变成 6<n7…...
Spring中如何为静态变量注入值
在 Spring 中,如果使用 Value 注解注入值,不能将其应用于 static 字段。Spring 只能为实例变量注入值,不能直接对静态变量进行注入。 使用 PostConstruct 初始化: 如果确实需要在静态上下文中使用该值,可以使用 Post…...

HTML5实现唐朝服饰网站模板源码
文章目录 1.设计来源1.1 网站首页-界面效果1.2 唐装演变-界面效果1.3 唐装配色-界面效果1.4 唐装花纹-界面效果1.5 唐装文化-界面效果 2.效果和源码2.1 动态效果2.2 源代码 源码下载万套模板,程序开发,在线开发,在线沟通 作者:xcL…...

ESXI识别USB设备
步骤: 插入usb设备到服务器。关闭虚拟机,添加USB控制器,根据U盘选择usb 3.0控制器,再添加usb设备如果usb设备灰色,进入主机打开SSH。使用xshell进行连接,运行以下命令: ESXI识别USB设备 - 插入…...

视频美颜SDK与直播美颜工具API是什么?计算机视觉技术详解
今天,小编将深入探讨视频美颜SDK与直播美颜工具API的概念及其背后的计算机视觉技术。 一、视频美颜SDK的概念 视频美颜SDK是一套用于开发实时美颜效果的工具集,开发者可以利用它在视频流中实现面部特征的优化。这些SDK通常提供了一系列功能,…...
not exist 解决一对多 场景 条件过滤问题
场景: 现在存在一对多关系,蓝色的盒子装的篮球,黄的的盒子装的黄球, 黑色的盒子 (模拟工作类似场景) boxIdballId蓝盒ID-15蓝盒ID-16蓝盒ID-17黄盒ID-212黄盒ID-215黄盒ID-216黑盒ID-38黑盒ID-39 需求&a…...

解决$‘r‘ command not found或者文件夹显示’tvsf 33‘$‘r‘
问题现象: 某客户反馈在执行脚本的时候文件夹显示存在问题,如下图: 但是脚本文件中的内容并没有\r字符,如下图: 也有客户反馈如下: 问题分析: $\r’是回车符的转义表示。在Unix和Linux系统中,回车符是一个不可见的控制字符,它通常用于文本文件中的行结尾。以上…...

linux:详解nohup命令
在 UNIX 和类 UNIX 操作系统(如 Linux 和 macOS)中,nohup 意图为后台运行且免疫挂断信号的命令,用于在用户注销(logout)或终端关闭后继续运行相应的进程。 基本语法 启动进程 nohup [COMMAND] [ARG...] …...

负载箱:充电桩测试利器
RCD负载箱是用于测试和验证电气设备在故障状态下的性能的设备。它可以模拟真实的负载情况,从而帮助工程师和技术人员对设备进行准确的检测和维护。此外,RCD负载箱也是一种重要的安全保护设备,主要用于防止电路中的漏电现象引发的事故。它通常…...

Ubuntu 开机自启动 .py / .sh 脚本,可通过脚本启动 roslaunch/roscore等
前言 项目中要求上电自启动定位程序,所以摸索了一种 Ubuntu 系统下开机自启动的方法,开机自启动 .sh 脚本,加载 ROS 环境的同时启动 .py 脚本。在 . py 脚本中启动一系列 ROS 节点。 一、 .sh 脚本的编写 #!/bin/bash # gnome-terminal -- …...
RabbitMQ 消息队列:生产者与消费者实现详解
在分布式系统中,消息队列(Message Queue, MQ)是一种重要的组件,用于解耦系统、异步处理任务以及实现系统间的通信。RabbitMQ 是一个流行的开源消息代理软件,它实现了高级消息队列协议(AMQP)。在…...
vue3项目中组件切换不起作用
以下这种方式写页面中组件切换,不起作用。 <component :is"steps[compIndex].comp" />解决:使用shallowReactive或者shallowRef把对应的组件名称重新定义下。 <component :is"compNames[steps[compIndex].comp]" /> &…...

YOLOv11改进策略【损失函数篇】| Slide Loss,解决简单样本和困难样本之间的不平衡问题
一、本文介绍 本文记录的是改进YOLOv11的损失函数,将其替换成Slide Loss,并详细说明了优化原因,注意事项等。Slide Loss函数可以有效地解决样本不平衡问题,为困难样本赋予更高的权重,使模型在训练过程中更加关注困难样…...

动静态库(Linux)
文章目录 前言一、静态库二、动态库三、深入理解动态库总结 前言 我们之前用过c语言的库.Linux中默认的都是使用动态库,如果想要使用静态库,就必须加上-static选项。默认都是安装的动态库,系统中一般没有静态库,如果要使用&#…...
51单片机和ARM单片机的区别
在嵌入式系统设计与应用中,单片机作为核心控制单元,扮演着至关重要的角色。其中,51单片机和ARM单片机作为两种常见的单片机类型,各自具有独特的特点和优势。本文将从多个维度深入探讨这两种单片机的区别,以便读者更好地…...
R语言AI模型部署方案:精准离线运行详解
R语言AI模型部署方案:精准离线运行详解 一、项目概述 本文将构建一个完整的R语言AI部署解决方案,实现鸢尾花分类模型的训练、保存、离线部署和预测功能。核心特点: 100%离线运行能力自包含环境依赖生产级错误处理跨平台兼容性模型版本管理# 文件结构说明 Iris_AI_Deployme…...
服务器硬防的应用场景都有哪些?
服务器硬防是指一种通过硬件设备层面的安全措施来防御服务器系统受到网络攻击的方式,避免服务器受到各种恶意攻击和网络威胁,那么,服务器硬防通常都会应用在哪些场景当中呢? 硬防服务器中一般会配备入侵检测系统和预防系统&#x…...

el-switch文字内置
el-switch文字内置 效果 vue <div style"color:#ffffff;font-size:14px;float:left;margin-bottom:5px;margin-right:5px;">自动加载</div> <el-switch v-model"value" active-color"#3E99FB" inactive-color"#DCDFE6"…...
OpenLayers 分屏对比(地图联动)
注:当前使用的是 ol 5.3.0 版本,天地图使用的key请到天地图官网申请,并替换为自己的key 地图分屏对比在WebGIS开发中是很常见的功能,和卷帘图层不一样的是,分屏对比是在各个地图中添加相同或者不同的图层进行对比查看。…...

智能分布式爬虫的数据处理流水线优化:基于深度强化学习的数据质量控制
在数字化浪潮席卷全球的今天,数据已成为企业和研究机构的核心资产。智能分布式爬虫作为高效的数据采集工具,在大规模数据获取中发挥着关键作用。然而,传统的数据处理流水线在面对复杂多变的网络环境和海量异构数据时,常出现数据质…...

uniapp手机号一键登录保姆级教程(包含前端和后端)
目录 前置条件创建uniapp项目并关联uniClound云空间开启一键登录模块并开通一键登录服务编写云函数并上传部署获取手机号流程(第一种) 前端直接调用云函数获取手机号(第三种)后台调用云函数获取手机号 错误码常见问题 前置条件 手机安装有sim卡手机开启…...

HubSpot推出与ChatGPT的深度集成引发兴奋与担忧
上周三,HubSpot宣布已构建与ChatGPT的深度集成,这一消息在HubSpot用户和营销技术观察者中引发了极大的兴奋,但同时也存在一些关于数据安全的担忧。 许多网络声音声称,这对SaaS应用程序和人工智能而言是一场范式转变。 但向任何技…...
第八部分:阶段项目 6:构建 React 前端应用
现在,是时候将你学到的 React 基础知识付诸实践,构建一个简单的前端应用来模拟与后端 API 的交互了。在这个阶段,你可以先使用模拟数据,或者如果你的后端 API(阶段项目 5)已经搭建好,可以直接连…...

针对药品仓库的效期管理问题,如何利用WMS系统“破局”
案例: 某医药分销企业,主要经营各类药品的批发与零售。由于药品的特殊性,效期管理至关重要,但该企业一直面临效期问题的困扰。在未使用WMS系统之前,其药品入库、存储、出库等环节的效期管理主要依赖人工记录与检查。库…...

密码学基础——SM4算法
博客主页:christine-rr-CSDN博客 专栏主页:密码学 📌 【今日更新】📌 对称密码算法——SM4 目录 一、国密SM系列算法概述 二、SM4算法 2.1算法背景 2.2算法特点 2.3 基本部件 2.3.1 S盒 2.3.2 非线性变换 编辑…...