.net Framework 4.6 WebAPI 使用Hangfire

news2024/11/6 7:31:47

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

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

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

相关文章

企业数据安全从0到1建设方法

随着中国数字经济的不断发展&#xff0c;各行各业都在积极推进数字化转型&#xff0c;数据安全逐渐受到国家和企业的重视。 近年来&#xff0c;国家持续颁布多种行业数据安全管理办法&#xff0c;明确各行业数据安全的建设标准&#xff0c;督促企业进行数据安全建设。 企业应该…

Delphi12 FMX给组件加上一个动画效果

Delphi12 FMX给组件加上一个动画效果 Delphi12 FMX 已经能编写windows&#xff0c;android平台下运行的应用&#xff0c;这里来体验一下 实现非常简单&#xff0c;使用IDE自带的动画组件轻松实现 效果图 这里用TCircle及 TImage来进行演示 首选拖入两个 TCircle及TImage …

安达发|太阳能设备行业APS计划排程软件能解决哪些问题

在当今快速发展的太阳能设备行业中&#xff0c;高级计划与排程&#xff08;APS&#xff09;软件成为了企业优化生产流程、提高生产效率和满足市场需求的关键工具。APS软件通过集成先进的算法和数据分析技术&#xff0c;为企业提供了一个全面的生产计划和排程解决方案。本文将探…

T5打卡-运动鞋识别

&#x1f368; 本文为&#x1f517;365天深度学习训练营中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 1.导入及查看数据&#xff1a; from tensorflow import keras from tensorflow.keras import layers,models import os,PIL,pathlib import matplotlib.pyplo…

AI与大数据的结合:如何从海量数据中提取价值

引言 在当今数字化时代&#xff0c;数据如同新石油&#xff0c;成为推动社会与商业进步的重要资源。随着物联网、社交媒体和企业运营中数据生成的激增&#xff0c;我们正处在一个数据爆炸的时代。然而&#xff0c;面对海量且复杂的数据信息&#xff0c;仅依靠传统的分析方法已经…

Python入门:asyncio异步编程结果处理

文章目录 📖 介绍 📖🏡 演示环境 🏡📒 文章内容 📒📝 处理异步任务的基本概念📝 获取第一个结果📝 添加回调函数📝 使用`return_exceptions`处理异常📝 判断任务完成情况📝 获取结果详情⚓️ 相关链接 ⚓️📖 介绍 📖 在Python编程中,异步并发可能…

钉钉H5微应用Springboot+Vue开发分享

文章目录 说明技术路线注意操作步骤思路图 一、创建钉钉应用二、创建java项目三、创建vue项目&#xff08;或uniapp项目&#xff09;&#xff0c;npm引入sdk的依赖四、拥有公网域名端口。开发环境可以使用&#xff08;贝锐花生壳等工具&#xff09;五、打开钉钉开发者平台&…

【YashanDB知识库】客户端字符集与数据库字符集兼容问题

本文转自YashanDB官网&#xff0c;具体内容请见https://www.yashandb.com/newsinfo/7352675.html?templateId1718516 问题现象 客户端yasql配置字符集为GBK&#xff0c;服务端yasdb配置字符集为UTF8&#xff0c;之后执行语句&#xff1a; 会发现&#xff1a; 期望是两个都…

【LeetCode】每日一题 2024_9_29 买票需要的时间(模拟)

前言 每天和你一起刷 LeetCode 每日一题~ LeetCode 启动&#xff01; 昨天的每日一题是线段树二分&#xff0c;题目难度远超我的能力范围&#xff0c;所以更不出来了 题目&#xff1a;买票需要的时间 代码与解题思路 func timeRequiredToBuy(tickets []int, k int) (sum in…

【Kubernetes知识点】 解读 Service 和 EndpointSlice 之间的关系

【Kubernetes知识点】 解读 Service 和 EndpointSlice 之间的关系 目录 1 概念 1.1 Service的概念1.2 Endpoint 的概念1.3 EndpointSlice 的引入 1.3.1 EndpointSlice支持的地址1.3.2 EndpointSlice的状态1.3.3 EndpointSlice的拓扑信息 1.4 Service 、Endpoint和 EndpointSl…

Beyond Compare 比较CRC值、二进制比较、关联规则比较,有何区别?(CRC比较、CRC值比较)

文章目录 Beyond Compare文件比较方法深入分析CRC值比较定义及工作原理应用场景优点和缺点 二进制比较定义及工作原理应用场景优点和缺点 关联规则比较定义及工作原理应用场景优点和缺点 比较示例 性能差异CRC值比较的性能影响优点缺点 二进制比较的性能影响优点缺点 关联规则比…

C项目--带权限的图书管理系统(1000多行代码,代码数据可下载,极其适合初学练手)

本专栏目的 更新C/C的相关的项目 前言 C语言的图书权限管理系统完结(进阶的一点后面更新)&#xff0c;1000多行代码(核心代码5、600行&#xff09;&#xff1b;本设计是一个比较综合的练习&#xff0c;用到数据结构&#xff08;顺序表、链表、静态链表&#xff09;、文件、排…

发布-订阅模式演示示例

<!DOCTYPE html> <html lang="en"><head><meta charset="UTF-8" /><meta name="viewport" content="width=device-width, initial-scale=1.0" /><title>发布-订阅模式示例</title><styl…

LC记录一:寻找旋转数组最小值、判断旋转数组是否存在给定元素

文章目录 33.搜索旋转排序数组81.搜索旋转排序数组||153.寻找旋转排序数组中的最小值154.寻找旋转排序数组中的最小值||参考链接 33.搜索旋转排序数组 https://leetcode.cn/problems/search-in-rotated-sorted-array/description/ 下面这张图片是LC154题官方题解提供的一个图…

重磅!25年3月起,PMP®考试将启用新教材!

近期&#xff0c;PMI对各科目教材进行了调整。9月27日宣布了2025年3月将会更新ACP的考试内容&#xff0c;新版考试仍将围绕敏捷思维和产品交付&#xff0c;但考试内容大纲(ECO)将整合为四大领域&#xff08;思维、领导力、产品、交付&#xff09;&#xff0c;融合现代新的项目类…

DAY18||530.二叉搜索树的最小绝对值差 |501.二叉搜索树中的众数| 236.二叉树的最近公共祖先

530.二叉搜索树的最小绝对值差 题目&#xff1a;530. 二叉搜索树的最小绝对差 - 力扣&#xff08;LeetCode&#xff09; 给你一个二叉搜索树的根节点 root &#xff0c;返回 树中任意两不同节点值之间的最小差值 。 差值是一个正数&#xff0c;其数值等于两值之差的绝对值。 …

MongoDB 快速入门+单机部署(附带脚本)

目录 介绍 体系结构 数据模型 BSON BSON 数据类型 特点 高性能 高可用 高扩展 丰富的查询支持 其他特点 部署 单机部署 普通安装 脚本安装 Docker Compose 安装 卸载 停止 MongoDB 删除包 删除数据目录 参考&#xff1a; https://docs.mongoing.com/ 介绍…

Ping到底干了啥?ICMP 协议详解

什么是 ICMP&#xff1f; ICMP&#xff08;Internet Control Message Protocol&#xff0c;互联网控制消息协议&#xff09;是一种网络层协议&#xff0c;主要用于在网络设备之间传递控制信息和错误消息。它是 IP 协议族的一部分&#xff0c;通常与 IP 协议一起使用。ICMP 的主…

cheese自动化平台开发环境搭建【图文版】

目的 cheese自动化平台是一款可以模拟鼠标和键盘操作的自动化工具。它可以帮助用户自动完成一些重复的、繁琐的任务&#xff0c;节省大量人工操作的时间。可以采用Vscode、IDEA编写&#xff0c;支持Java、Python、nodejs、GO、Rust、Lua。官方提供了视频版教程&#xff0c;对于…

leetcode每日一题day20(24.9.30)——座位预约管理系统

思路&#xff1a;由于一直是出最小的编号&#xff0c;并且除此之外只有添加元素的操作&#xff0c;如果使用数组存储&#xff0c;并记录&#xff0c;这样出最小编号时间是O(n)复杂度,释放一个座位则是O(1)在操作出线机会均等的情况下&#xff0c;平均是O(n/2), 但对于这种重复 …