项目

Hangfire后台工作者管理器

Hangfire 是一款高级的后台作业与工作者管理系统。您可以将Hangfire与ABP框架集成,替代 默认的后台工作者管理器

主要优势在于,您可以使用相同的服务器集群来管理后台作业和工作者,同时利用 Hangfire 为 周期性任务(即后台工作者)提供的高级调度功能。

安装

建议使用 ABP CLI 安装此包。

使用ABP CLI

在项目文件夹(.csproj文件所在目录)打开命令行窗口,输入以下命令:

abp add-package Volo.Abp.BackgroundWorkers.Hangfire

手动安装

如需手动安装:

  1. Volo.Abp.BackgroundWorkers.Hangfire NuGet包添加到您的项目:

    dotnet add package Volo.Abp.BackgroundWorkers.Hangfire
    
  2. 在模块的依赖列表中添加AbpBackgroundWorkersHangfireModule

[DependsOn(
    //...其他依赖
    typeof(AbpBackgroundWorkersHangfireModule) //添加新模块依赖
    )]
public class YourModule : AbpModule
{
}

Hangfire后台工作者集成提供了一个适配器 HangfirePeriodicBackgroundWorkerAdapter ,可自动将任何派生自 PeriodicBackgroundWorkerBaseAsyncPeriodicBackgroundWorkerBase 的类加载为 IHangfireBackgroundWorker 实例。这使得即使您已有基于 默认后台工作者实现 的后台工作者,也能轻松切换至使用Hangfire作为后台管理器。

配置

您可为Hangfire安装任何存储方式,最常用的是SQL Server(参见 Hangfire.SqlServer NuGet包)。

安装这些NuGet包后,需配置项目以使用Hangfire。

  1. 首先,修改 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配置存储。

  1. 如需使用Hangfire仪表盘,可在Module类的OnApplicationInitialization方法中添加UseAbpHangfireDashboard调用:
 public override void OnApplicationInitialization(ApplicationInitializationContext context)
 {
    var app = context.GetApplicationBuilder();
            
    // ... 其他配置
    
    app.UseAbpHangfireDashboard(); //应在app.UseConfiguredEndpoints()之前添加到请求管道
    app.UseConfiguredEndpoints();
 }

AbpHangfireOptions

您可通过配置AbpHangfireOptionsBackgroundJobServerOptions来自定义服务器。

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;
    }
}

您可直接实现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并在运行时添加工作者。当应用程序关闭时,后台工作者管理器将停止并释放所有已注册的工作者。

在本文档中