博客园不常在线

有问题联系微信

微信号

微信公众号

Asp .Net Core 系列:Asp .Net Core 集成 Hangfire+MySQL

简介

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。

image

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"));
posted @ 2024-03-13 20:58  Code技术分享  阅读(982)  评论(4编辑  收藏  举报