3.9 KiB
						
					
					
				
			
		
		
	
	Hangfire Background Worker Manager
Hangfire是一个高级的后台工作者管理. 你可以用ABP框架Hangfire集成代替默认后台工作者管理.
主要优点是你可以使用相同的服务器群来管理你的后台作业和工作线程以及利用 Hangfire 提供的Recurring Jobs高级调度功能.
安装
建议使用ABP CLI安装包.
使用ABP CLI
在项目的文件夹(.csproj文件)中打开命令行窗口输入以下命令:
abp add-package Volo.Abp.BackgroundWorkers.Hangfire
手动安装
如果你想手动安装;
- 
添加 Volo.Abp.BackgroundWorkers.Hangfire NuGet包添加到你的项目:
Install-Package Volo.Abp.BackgroundWorkers.Hangfire - 
添加
AbpBackgroundWorkersHangfireModule到你的模块的依赖列表: 
[DependsOn(
    //...other dependencies
    typeof(AbpBackgroundWorkersHangfireModule) //Add the new module dependency
    )]
public class YourModule : AbpModule
{
}
Hangfire后台工作者集成提供了
HangfirePeriodicBackgroundWorkerAdapter来适配PeriodicBackgroundWorkerBase和AsyncPeriodicBackgroundWorkerBase派生类. 所以你依然可以按照后台工作者文档来定义后台作业.
创建后台工作者
HangfireBackgroundWorkerBase 是创建一个后台工作者简单的方法.
public class MyLogWorker : HangfireBackgroundWorkerBase
{
    public MyLogWorker()
    {
        RecurringJobId = nameof(MyLogWorker);
        CronExpression = Cron.Daily();
    }
    public override Task DoWorkAsync(CancellationToken cancellationToken = default)
    {
        Logger.LogInformation("Executed 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("Executed 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 并在运行时添加后台工作者.