简介

https://www.hangfire.io/

在 .NET 和 .NET Core 应用程序中执行后台处理的简单方法,无需 Windows 服务或单独的进程。

Hangfire 是一个开源的.NET 任务调度框架,它提供了内置集成化的控制台,允许用户直观明了地查看作业调度情况。Hangfire 不需要依赖于单独的应用程序执行(如 Windows 服务或 Windows 计划任务),支持持久性存储,并且是开源且免费用于商业用途的。

Hangfire 的核心组件包括客户端、持久化存储和服务端。它基于队列的任务处理机制,客户端使用 BackgroundJob 类的静态方法 Enqueue 来调用指定的方法或匿名函数,并将任务持久化到数据库。一旦任务被持久化,Hangfire 服务端会立即从数据库获取相关任务并装载到相应的 Job Queue 下进行处理。如果任务执行过程中没有异常,则仅处理一次;若发生异常,Hangfire 提供了自动重试功能,异常及重试信息都会被记录到数据库中,用户可以通过 Hangfire 控制面板查看这些信息。

Hangfire 适用于大多数.NET 平台,包括.NET Framework 4.5 或更高版本、.NET Core 1.0 或更高版本,以及与.NET Standard 1.3 兼容的任何平台。另一个关键组件 Hangfire Server 负责检查持久存储中排队的后台作业,并以可靠的方式执行它们。排队作业由专用的工作线程池处理。

优点

  1. 简单易用:Hangfire 提供了一个简洁的 API,开发者只需要几行代码就可以完成任务的调度。例如,你可以使用BackgroundJob.Enqueue方法将任务加入队列,使用BackgroundJob.Schedule方法来设定一个未来时间点执行的任务。
  2. 强大的任务调度能力:Hangfire 支持多种任务调度方式,包括定时任务、轮询任务、一次性任务等。它还提供了灵活的任务调度策略,如固定间隔、轮询等,可以满足不同场景的需求。
  3. 可扩展性:Hangfire 可以很容易地集成到现有的.NET 应用程序中,并且可以与其他流行的.NET 库和框架(如 Autofac、Ninject 等)一起使用。此外,Hangfire 支持基于队列的任务处理,任务执行不是同步的,而是放到一个持久化队列中,以便马上把请求控制权返回给调用者。
  4. 任务持久化:Hangfire 提供了任务持久化的功能,确保任务在应用程序重启后依然可以执行。这使得 Hangfire 在处理周期性任务或需要长时间运行的任务时非常可靠。
  5. 日志和监控功能:Hangfire 提供了详细的日志和监控功能,便于开发者跟踪和管理任务执行情况。这有助于开发者及时发现和解决问题,提高应用程序的稳定性和性能。
  6. 支持多种消息队列:Hangfire 支持多种消息队列,如 SQL Server、RabbitMQ 和 Redis 等,这为用户提供了更多的选择和灵活性。

Asp .Net Core 集成 Hangfire+MySQL

1. 安装必要的 NuGet 包

首先,你需要安装 Hangfire 相关的 NuGet 包,以及 Hangfire 的 MySQL 存储包。

使用 NuGet 包管理器控制台 (Package Manager Console) 或 Visual Studio 的 NuGet 包管理器来安装以下包:

Install-Package Hangfire.AspNetCore
Install-Package Hangfire.MySqlStorage

2. 配置 Hangfire 使用 MySQL 存储

Startup.cs 文件的 ConfigureServices 方法中,配置 Hangfire 以使用 MySQL 作为其后端存储。

            builder.Services.AddHangfire(config =>
{
config.SetDataCompatibilityLevel(CompatibilityLevel.Version_180)
.UseSimpleAssemblyNameTypeSerializer()
.UseRecommendedSerializerSettings(); config.UseStorage(
new MySqlStorage(
@"server=127.0.0.1;user=root;password=123456;database=hangfire;allowuservariables=True;",
//必须允许用户自定义参数,不然面板不能使用
new MySqlStorageOptions()));
}); builder.Services.AddHangfireServer();
builder.Services.AddTransient<IBackgroundJobClient, BackgroundJobClient>();

确保将 MySQL 连接字符串替换为你自己的数据库连接信息。

3. 配置 Hangfire Dashboard(可选)

如果你想使用 Hangfire Dashboard 来查看和管理后台任务,你需要在 Configure 方法中添加相应的中间件。

app.UseHangfireDashboard();

现在,你可以通过访问 /hangfire 路径来查看 Hangfire Dashboard。

MisfireHandlingMode(失火处理模式)

  • Relaxed:默认模式。指定只创建一个后台作业,不管错过了多少次都不创建。后台的“时间”参数作业将指向安排后台作业的时间。
  • Strict:指定将为每个错过的事件创建新的后台作业,并将“时间”参数设置为相应的计划时间。
  • Ignorable:指定不应在错过的计划中创建任何后台作业,无论错过的次数如何。

案例

即发即弃作业

WeatherForecast weather = new WeatherForecast();
BackgroundJob.Enqueue(() => HelloJob.Test4(weather));

延迟作业

BackgroundJob.Schedule(() => HelloJob.Test2("Test2"), TimeSpan.FromMinutes(1));

重复作业

            RecurringJob.AddOrUpdate("static-job", () => HelloJob.Test2(DateTime.Now.ToLongTimeString()), "0 * * * * ?", new RecurringJobOptions()
{
MisfireHandling = MisfireHandlingMode.Ignorable,
TimeZone = TimeZoneInfo.Local,
}); RecurringJob.AddOrUpdate<IOCJob>("ioc-job", job => job.Test(), "0 * * * * ?");

延续作业

            var jobId = BackgroundJob.Enqueue(() => HelloJob.Test1());
BackgroundJob.ContinueJobWith(jobId, () => HelloJob.Test2("Test3"));

Asp .Net Core 系列:Asp .Net Core 集成 Hangfire+MySQL的更多相关文章

  1. [ASP.NET MVC2 系列] ASP.Net MVC教程之《在15分钟内用ASP.Net MVC创建一个电影数据库应用程序》

    [ASP.NET MVC2 系列]      [ASP.NET MVC2 系列] ASP.Net MVC教程之<在15分钟内用ASP.Net MVC创建一个电影数据库应用程序>       ...

  2. 基于 abp vNext 和 .NET Core 开发博客项目 - 集成Hangfire实现定时任务处理

    上一篇文章(https://www.cnblogs.com/meowv/p/12956696.html)成功使用了Redis缓存数据,大大提高博客的响应性能. 接下来,将完成一个任务调度中心,关于定时 ...

  3. 跨平台应用集成(在ASP.NET Core MVC 应用程序中集成 Microsoft Graph)

    作者:陈希章 发表于 2017年6月25日 谈一谈.NET 的跨平台 终于要写到这一篇了.跨平台的支持可以说是 Office 365 平台在设计伊始就考虑的目标.我在前面的文章已经提到过了,Micro ...

  4. asp.net core 系列 18 web服务器实现

    一. ASP.NET Core Module 在介绍ASP.NET Core Web实现之前,先来了解下ASP.NET Core Module.该模块是插入 IIS 管道的本机 IIS 模块(本机是指 ...

  5. asp.net core 系列 16 Web主机 IWebHostBuilder

    一.概述 在asp.net core中,Host主机负责应用程序启动和生存期管理.host主机包括Web 主机(IWebHostBuilder)和通用主机(IHostBuilder).Web 主机是适 ...

  6. Asp.net Core 系列之--5.认证、授权与自定义权限的实现

    ChuanGoing 2019-11-24 asp.net core系列已经来到了第五篇,通过之前的基础介绍,我们了解了事件订阅/发布的eventbus整个流程,初探dapper ORM实现,并且简单 ...

  7. 【目录】asp.net core系列篇

    随笔分类 - asp.net core系列篇 asp.net core系列 68 Filter管道过滤器 摘要: 一.概述 本篇详细了解一下asp.net core filters,filter叫&q ...

  8. Taurus.MVC 微服务框架 入门开发教程:项目集成:2、客户端:ASP.NET Core(C#)项目集成:应用中心。

    系列目录: 本系列分为项目集成.项目部署.架构演进三个方向,后续会根据情况调整文章目录. 本系列第一篇:Taurus.MVC V3.0.3 微服务开源框架发布:让.NET 架构在大并发的演进过程更简单 ...

  9. 基于Asp.Net Core Mvc和EntityFramework Core 的实战入门教程系列-1

    来个目录吧: 第一章 第二章 第三章 暂时就这么多.后面路线更新吧 本系列文章为翻译加上我个人的使用心得理解,希望帮助热爱学习的程序员. 珍重声明:本系列文章会跟原文有点出入,去掉了罗里吧嗦的文字. ...

  10. ASP.NET CORE系列【一】搭建ASP.NET CORE项目

    为什么要使用 ASP.NET Core? NET Core 刚发布的时候根据介绍就有点心里痒痒,微软的尿性都懂的,新东西bug太多,现在2.0也发布很久了,决定研究一下. ASP.NET Core官方 ...

随机推荐

  1. vscode连不上云服务器,一直报超时错误|但是xshell那些又可以连上?为什么vscode连不上?|命令行输出管道报错 -bash: command not found 导致的一系列问题

    前言 那么这里博主先安利一些干货满满的专栏了! 首先是博主的高质量博客的汇总,这个专栏里面的博客,都是博主最最用心写的一部分,干货满满,希望对大家有帮助. 高质量博客汇总https://blog.cs ...

  2. Kafka-数据出现积压的原因以及如何解决积压问题?

    Kafka数据积压的原因有很多,比如消费端处理能力不足.生产端消息发送速度过快等.解决方法也有很多,以下是一些常见的解决方法 : 增加分区数:如果数据量很大,合理的增加Kafka分区数是关键.但是分区 ...

  3. win10 通过 ssh 连接云服务器失败 are too open. bad permissions.

    最近突然想起了自己的学生机服务器,买来了吃灰很久了,拿出来捣鼓捣鼓 以前服务器装的 windows server,这次把它重装成了 CentOS 8.0,然后按官网步连接步骤骤一步一步尝试. 腾讯云官 ...

  4. NC19429 红球进黑洞

    题目链接 题目 题目描述 在心理疏导室中有一种奇特的疏导工具,叫做红球.红球被提前分为了许多正方形小方格. 每当有人来找ATB做心理疏导时,ATB就会让他去先玩红球,然后通过红球小格方的高度来判断一个 ...

  5. SATA 中ATA与AHCI的区别

    SATA中ATA和AHCI有什么区别?   1.ACHI是针对SATA2设计的,可以卡其NCQ功能,表面上没有速度的优势,但是因为算法不同,可以有效的保护硬盘.ATA 是硬件模拟IDE的一种方法.表面 ...

  6. git 拉取指定目录

    指令方式 打开 git 自带的Git Bash 工具 以拉取github中 fastjson 的 /src/test/java/oracle/sql/ 目录为例 1.创建文件夹和git 初始化 cd ...

  7. fastjson反序列化各版本利用汇总

  8. MASM32 - PlaySound的实现

    MASM安装教程: https://blog.csdn.net/u010486308/article/details/105495848 代码参考: .model flat, stdcall opti ...

  9. 【Android逆向】反调试绕过(nop 绕过)

    1. 这是看雪上的一个题目,要求显示出 it is success https://www.kanxue.com/work-task_read-800648.htm 第三题 2. apk 安装到手机, ...

  10. Flutter——安装依赖包时,出现Waiting for another flutter command to release the startup lock

    问题描述 运行 flutter packages get 时 出现 Waiting for another flutter command to release the startup lock 解决 ...