ASP.NET Core 8.0 中使用 Hangfire 调度 API

在这篇博文中,我们将引导您完成将 Hangfire 集成到 ASP.NET Core NET Core 项目中以安排 API 每天运行的步骤。Hangfire 是一个功能强大的库,可简化 .NET 应用程序中的后台作业处理,使其成为调度任务的绝佳选择。继续阅读以了解如何设置 Hangfire 并将其配置为每天运行您的 API。

为什么在 ASP.NET Core 中使用 Hangfire 执行后台作业?

在深入实现之前,让我们先了解一下为什么 Hangfire 是后台作业的首选:

·易于使用: Hangfire 设置和使用简单,让您专注于应用程序的核心功能。

·可扩展性:它可以处理大量作业,并且可扩展以满足您的应用程序的需求。

·可靠性: Hangfire 确保即使在服务器重启后仍能执行作业,为关键任务提供可靠性。

**·仪表板:**它带有一个用于监控作业的内置仪表板,可以轻松跟踪和管理后台进程。

Hangfire 提供的调度类型

Hangfire 支持各种类型的后台作业,使其能够灵活地应用于不同的场景。以下是它提供的主要调度类型:

·即发即弃作业: 这些作业仅执行一次,且几乎在创建后立即执行。它们适用于需要快速完成且无需重复的任务。

BackgroundJob.Enqueue(() => Console.WriteLine("Fire-and-forget job executed!"));

·延迟作业: 这些作业仅执行一次,但不会立即执行。它们被安排在指定的延迟后运行。

BackgroundJob.Schedule(() => Console.WriteLine("Delayed job executed!"), TimeSpan.FromDays(1));

·重复作业: 这些作业会按照指定的 CRON 计划执行多次。它们对于需要定期运行的任务非常有用。

RecurringJob.AddOrUpdate(() => Console.WriteLine("Recurring job executed!"), Cron.Daily);

·延续: 这些作业在其父作业完成后执行。它们对于作业依赖于另一作业的成功完成的工作流很有用。

var jobId = BackgroundJob.Enqueue(() => Console.WriteLine("Parent job executed!"));

BackgroundJob.ContinueWith(jobId, () => Console.WriteLine("Continuation job executed!"));

先决条件

开始之前,请确保您已准备好以下物品:

· Visual Studio 2019 或更高版本

· .NET Core SDK 安装

· ASP.NET Core 基础知识 NET Core

集成 Hangfire 的分步指南

**步骤 1:**创建一个新的 ASP.NET Core Web API 项目

首先,创建一个新的 ASP.NET Core 项目或打开一个现有项目。如果您没有任何项目,请按照此处提到的步骤创建一个。我还添加了创建测试 API 的步骤。

**第 2 步:**安装 Hangfire NuGet 包

· 转到工具>NuGet 包管理器>管理解决方案的 NuGet 包...

· 搜索 Hangfire 并安装最新版本。

· 搜索System.Data.SqlClient并安装最新的。

步骤 3: 创建用于 Hangfire 的数据库

打开 SSMS 并创建一个新数据库。您也可以使用现有的数据库。

步骤 4: 将连接字符串添加到 appsettings.json

在 appsettings.json 文件中,添加 SQL Server 的连接字符串:

{

"Logging": {

"LogLevel": {

"Default": "Information",

"Microsoft.AspNetCore": "Warning"

}

},

"AllowedHosts": "*",

"ConnectionStrings": {

"TestDatabase": "Server=SHEKHAR\\SQLEXPRESS;Database=HangfireDemo;TrustServerCertificate=True;User Id=adminuser;Password=adminuser;"

}

}

步骤 5: 在 Program.cs 中配置 Hangfire

修改 Program.cs 文件来配置 Hangfire:

using Hangfire;

using Hangfire.SqlServer;

var builder = WebApplication.CreateBuilder(args);

// Add services to the container.

builder.Services.AddControllers();

// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle

builder.Services.AddEndpointsApiExplorer();

builder.Services.AddSwaggerGen();

// Step 1 -> Hangfire configuration with SQL Server storage

var connectionString = builder.Configuration.GetConnectionString("TestDatabase");

builder.Services.AddHangfire(config =>

{

config.UseSqlServerStorage(connectionString, new SqlServerStorageOptions

{

CommandBatchMaxTimeout = TimeSpan.FromMinutes(5),

SlidingInvisibilityTimeout = TimeSpan.FromMinutes(5),

QueuePollInterval = TimeSpan.Zero,

UseRecommendedIsolationLevel = true,

DisableGlobalLocks = true

});

});

// Step 2 -> Add Hangfire's server.

builder.Services.AddHangfireServer();

var app = builder.Build();

// Configure the HTTP request pipeline.

if (app.Environment.IsDevelopment())

{

app.UseSwagger();

app.UseSwaggerUI();

}

app.UseHttpsRedirection();

app.UseAuthorization();

app.MapControllers();

//Step 3 -> Added the dashboard url

app.UseHangfireDashboard("/hangfire");

app.Run();

步骤 6: 创建后台作业来调用 API

创建一个调用 API 的后台作业。在此示例中,我使用我的 API 端点 https ://localhost:7282/api/TestApi。我们需要创建一个服务来调用此端点,然后使用 Hangfire 对其进行调度。

创建一个新的服务类 ApiCallService.cs 并添加以下代码:

namespace TestApi

{

public class ApiCallService

{

private readonly HttpClient _httpClient;

public ApiCallService(HttpClient httpClient)

{

_httpClient = httpClient;

}

public async Task CallApiEndpointAsync()

{

var response = await _httpClient.GetAsync("https://localhost:7282/api/TestApi");

response.EnsureSuccessStatusCode();

// Log success or handle the response as needed

}

}

}

在 Program.cs 中注册 HttpClient 和 ApiCallService:

builder.Services.AddHttpClient<ApiCallService>();

在 Program.cs 中安排作业:

// Schedule the job to call the API endpoint

RecurringJob.AddOrUpdate<ApiCallService>("call-api-endpoint", service => service.CallApiEndpointAsync(), Cron.Daily); // Adjust the schedule as needed

最终的 Program.cs 代码:

using Hangfire;

using Hangfire.SqlServer;

using TestApi;

var builder = WebApplication.CreateBuilder(args);

// Add services to the container.

builder.Services.AddControllers();

// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle

builder.Services.AddEndpointsApiExplorer();

builder.Services.AddSwaggerGen();

// Step 1 -> Hangfire configuration with SQL Server storage

var connectionString = builder.Configuration.GetConnectionString("TestDatabase");

builder.Services.AddHangfire(config =>

{

config.UseSqlServerStorage(connectionString, new SqlServerStorageOptions

{

CommandBatchMaxTimeout = TimeSpan.FromMinutes(5),

SlidingInvisibilityTimeout = TimeSpan.FromMinutes(5),

QueuePollInterval = TimeSpan.Zero,

UseRecommendedIsolationLevel = true,

DisableGlobalLocks = true

});

});

// Step 2 -> Add Hangfire's server.

builder.Services.AddHangfireServer();

// Register httpclient

builder.Services.AddHttpClient<ApiCallService>();

var app = builder.Build();

// Configure the HTTP request pipeline.

if (app.Environment.IsDevelopment())

{

app.UseSwagger();

app.UseSwaggerUI();

}

app.UseHttpsRedirection();

app.UseAuthorization();

app.MapControllers();

//Step 3 -> Added the dashboard url

app.UseHangfireDashboard("/hangfire");

// Schedule the job to call the API endpoint

RecurringJob.AddOrUpdate<ApiCallService>("call-api-endpoint", service => service.CallApiEndpointAsync(), Cron.Daily); // Adjust the schedule as needed

app.Run();

步骤 7: 运行并监控您的应用程序

运行项目后,您将看到数据库中创建了一些新表。Hangfire 创建这些表是为了跟踪作业并执行其他操作:

访问https://localhost:7282/hangfire/上的 Hangfire 仪表板来监控您的后台作业。

单击"重复作业"选项卡可查看所有重复作业。目前仅显示我们已安排的作业。

单击"作业">"成功"以查看作业的状态。

要获取更多详细信息,请单击该职位:

最终代码:

这是已添加所有的代码:https://download.csdn.net/download/hefeng_aspnet/89918351

结论

通过遵循本指南,您已将 Hangfire 集成到您的 . NET 8 项目中,并使用 SQL Server 作为存储提供程序,安排了使用 Hangfire 的 API 调用。此设置可确保您的 API 按照指定的时间表定期调用。有关更多高级 Hangfire 配置和存储选项,请参阅官方 Hangfire 文档

相关推荐
yaosheng_VALVE2 小时前
探究全金属硬密封蝶阀的奥秘-耀圣控制
运维·eclipse·自动化·pyqt·1024程序员节
dami_king2 小时前
SSH特性|组成|SSH是什么?
运维·ssh·1024程序员节
一个通信老学姐5 天前
专业125+总分400+南京理工大学818考研经验南理工电子信息与通信工程,真题,大纲,参考书。
考研·信息与通信·信号处理·1024程序员节
sheng12345678rui5 天前
mfc140.dll文件缺失的修复方法分享,全面分析mfc140.dll的几种解决方法
游戏·电脑·dll文件·dll修复工具·1024程序员节
huipeng9266 天前
第十章 类和对象(二)
java·开发语言·学习·1024程序员节
earthzhang20216 天前
《深入浅出HTTPS》读书笔记(19):密钥
开发语言·网络协议·算法·https·1024程序员节
爱吃生蚝的于勒7 天前
计算机基础 原码反码补码问题
经验分享·笔记·计算机网络·其他·1024程序员节
earthzhang20217 天前
《深入浅出HTTPS》读书笔记(20):口令和PEB算法
开发语言·网络协议·算法·https·1024程序员节
一个通信老学姐7 天前
专业140+总分410+浙江大学842信号系统与数字电路考研经验浙大电子信息与通信工程,真题,大纲,参考书。
考研·信息与通信·信号处理·1024程序员节
earthzhang20218 天前
《深入浅出HTTPS》读书笔记(18):公开密钥算法RSA(续)
网络·网络协议·算法·https·1024程序员节