简介

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. python list 转二叉树 及遍历

    from __future__ import annotations from typing import Union from collections import deque class Tree ...

  2. uni-app+vue3会遇到哪些问题

    已经用 uni-app+vue3+ts 开发了一段时间,记录一下日常遇见的问题和解决办法 uni-app 中的单端代码 uni-app 是支持多端,如果你想让你的代码,只在部分平台使用,那么就需要用的 ...

  3. .NET周刊【1月第3期 2024-01-24】

    国内文章 .NET开源的简单.快速.强大的前后端分离后台权限管理系统 https://www.cnblogs.com/Can-daydayup/p/17980851 本文介绍了中台Admin,一款基于 ...

  4. 《ASP.NET Core 与 RESTful API 开发实战》-- (第9章)-- 读书笔记(上)

    第 9 章 测试和文档 9.1 测试 测试是软件生命周期中的一个非常重要的阶段,对于保证软件的可靠性具有极其重要的意义 常见的测试方法有很多,根据不同的维度,可以把测试方法分为不同的类别 从观察结构的 ...

  5. Pandas分析泰坦尼克号生还比例

    提出问题 影响乘客生还的因素很多,这里只对乘客的性别.年龄.乘客等级.这三个因素感兴趣, 看看这四个因素是否会影响乘客的生还率. 1.性别是否会影响生还率 2.年龄是否会影响生还率 3.乘客等级会否会 ...

  6. 教你用Rust实现Smpp协议

    本文分享自华为云社区<华为云短信服务教你用Rust实现Smpp协议>,作者: 张俭. 协议概述 SMPP(Short Message Peer-to-Peer)协议起源于90年代,最初由A ...

  7. QT - Day 3

    对话框 分类 模态对话框 QDialog dlg(this); dlg.resize(200,100); dlg.exec(); //窗口阻塞 非模态对话框 QDialog *dlg2 = new Q ...

  8. Redis原理再学习02:数据结构-动态字符串sds

    Redis原理再学习:动态字符串sds 字符 字符就是英文里的一个一个英文字母,比如:a.中文里的单个汉字,比如:好. 字符串就是多个字母或多个汉字组成,比如字符串:redis,中文字符串:你好吗. ...

  9. MySQL重新设置auto_increment值

    需求描述 通常,我们都会在数据库表中设置一个自增字段作为主键,该字段的值会随着添加新记录而自增. 同时也必须注意,这个自增字段的值只会一直增加,即使把记录删除了,该自增字段的值也不会变小. 因此,就会 ...

  10. E4X已经被废弃,各浏览器基本上不再支持它;

    E4X是一种在ECMAScript标准的基础上加入的动态XML支持的程序语言扩展. 到2019年,目前主流浏览器已经不太支持它了,一些版本的Firefox浏览器或许还可以使用,但它已经在主流浏览器的主 ...