Hangfire后台工作者管理器
Hangfire 是一款高级的后台作业与工作者管理系统。您可以将Hangfire与ABP框架集成,替代 默认的后台工作者管理器 。
主要优势在于,您可以使用相同的服务器集群来管理后台作业和工作者,同时利用 Hangfire 为 周期性任务(即后台工作者)提供的高级调度功能。
安装
建议使用 ABP CLI 安装此包。
使用ABP CLI
在项目文件夹(.csproj文件所在目录)打开命令行窗口,输入以下命令:
abp add-package Volo.Abp.BackgroundWorkers.Hangfire
手动安装
如需手动安装:
将Volo.Abp.BackgroundWorkers.Hangfire NuGet包添加到您的项目:
dotnet add package Volo.Abp.BackgroundWorkers.Hangfire在模块的依赖列表中添加
AbpBackgroundWorkersHangfireModule:
[DependsOn(
//...其他依赖
typeof(AbpBackgroundWorkersHangfireModule) //添加新模块依赖
)]
public class YourModule : AbpModule
{
}
Hangfire后台工作者集成提供了一个适配器
HangfirePeriodicBackgroundWorkerAdapter,可自动将任何派生自PeriodicBackgroundWorkerBase和AsyncPeriodicBackgroundWorkerBase的类加载为IHangfireBackgroundWorker实例。这使得即使您已有基于 默认后台工作者实现 的后台工作者,也能轻松切换至使用Hangfire作为后台管理器。
配置
您可为Hangfire安装任何存储方式,最常用的是SQL Server(参见 Hangfire.SqlServer NuGet包)。
安装这些NuGet包后,需配置项目以使用Hangfire。
- 首先,修改
Module类(例如:<YourProjectName>HttpApiHostModule),在ConfigureServices方法中添加Hangfire的存储和连接字符串配置:
public override void ConfigureServices(ServiceConfigurationContext context)
{
var configuration = context.Services.GetConfiguration();
var hostingEnvironment = context.Services.GetHostingEnvironment();
//... 其他配置
ConfigureHangfire(context, configuration);
}
private void ConfigureHangfire(ServiceConfigurationContext context, IConfiguration configuration)
{
context.Services.AddHangfire(config =>
{
config.UseSqlServerStorage(configuration.GetConnectionString("Default"));
});
}
必须为Hangfire配置存储。
- 如需使用Hangfire仪表盘,可在
Module类的OnApplicationInitialization方法中添加UseAbpHangfireDashboard调用:
public override void OnApplicationInitialization(ApplicationInitializationContext context)
{
var app = context.GetApplicationBuilder();
// ... 其他配置
app.UseAbpHangfireDashboard(); //应在app.UseConfiguredEndpoints()之前添加到请求管道
app.UseConfiguredEndpoints();
}
AbpHangfireOptions
您可通过配置AbpHangfireOptions的BackgroundJobServerOptions来自定义服务器。
Configure<AbpHangfireOptions>(options =>
{
// 若未设置ServerOptions,ABP将使用默认的BackgroundJobServerOptions实例
options.ServerOptions = new BackgroundJobServerOptions
{
Queues = ["default", "alpha"],
//... 其他属性
};
});
无需调用
AddHangfireServer方法,ABP将使用AbpHangfireOptions的ServerOptions创建服务器。
创建后台工作者
HangfireBackgroundWorkerBase是创建后台工作者的简便方式。
public class MyLogWorker : HangfireBackgroundWorkerBase
{
public MyLogWorker()
{
RecurringJobId = nameof(MyLogWorker);
CronExpression = Cron.Daily();
}
public override Task DoWorkAsync(CancellationToken cancellationToken = default)
{
Logger.LogInformation("已执行MyLogWorker..!");
return Task.CompletedTask;
}
}
- RecurringJobId 为可选参数,参见Hangfire文档
- CronExpression 为CRON表达式,参见CRON表达式
您可直接实现
IHangfireBackgroundWorker接口,但HangfireBackgroundWorkerBase提供了Logger等实用属性。
工作单元(UnitOfWork)
public class MyLogWorker : HangfireBackgroundWorkerBase, IMyLogWorker
{
public MyLogWorker()
{
RecurringJobId = nameof(MyLogWorker);
CronExpression = Cron.Daily();
}
public override Task DoWorkAsync(CancellationToken cancellationToken = default)
{
using (var uow = LazyServiceProvider.LazyGetRequiredService<IUnitOfWorkManager>().Begin())
{
Logger.LogInformation("已执行MyLogWorker..!");
return Task.CompletedTask;
}
}
}
注册后台工作者管理器
创建后台工作者类后,需将其添加到IBackgroundWorkerManager中。最常见的做法是在模块类的OnApplicationInitializationAsync方法中添加:
[DependsOn(typeof(AbpBackgroundWorkersModule))]
public class MyModule : AbpModule
{
public override async Task OnApplicationInitializationAsync(
ApplicationInitializationContext context)
{
await context.AddBackgroundWorkerAsync<MyLogWorker>();
}
}
context.AddBackgroundWorkerAsync(...)是以下表达式的快捷方式:
context.ServiceProvider
.GetRequiredService<IBackgroundWorkerManager>()
.AddAsync(
context
.ServiceProvider
.GetRequiredService<MyLogWorker>()
);
因此,它会解析给定的后台工作者并将其添加到IBackgroundWorkerManager。
虽然我们通常在OnApplicationInitializationAsync中添加工作者,但并无严格限制。您可在任何地方注入IBackgroundWorkerManager并在运行时添加工作者。当应用程序关闭时,后台工作者管理器将停止并释放所有已注册的工作者。
抠丁客


