ABP Framework - 后台服务

发布时间 2023-07-20 13:55:58作者: 摧残一生

后台服务

在ABP Framework中,后台分为作业和工作者,他们的不同点为:

  • 作业
    • 持久性的任务,可放在队列中执行。
    • 失败后会继续重试
  • 工作者
    • 在后台运行的独立线程
    • 定期运行

后台作业

依赖包:Volo.Abp.BackgroundJobs.Abstraction

创建后台作业

后台作业是通过实现IBackgroundJob<TArgs>的现接口或继承自BackgroundJob<TArgs>的类。在***.Application项目中添加StudentBackgroundJob

/// <summary>
/// 创建后台作业
/// </summary>
public class StudentBackgroundJob : BackgroundJob<Student>, ITransientDependency
{
    /// <summary>
    /// 实现Execute方法
    /// 其中TArgs为Student实体类
    /// </summary>
    /// <param name="args"></param>
    public override void Execute(Student args)
    {
        // 判断出生日期
        if (DateTime.Now.Day == args.Brithday.Day &&
            DateTime.Now.Month == args.Brithday.Month) {
            args.Age += 1;
            // 发送生日祝福
            ....
        }
    }
}

当作业在执行时出现异常,需抛出异常而不是将异常进行隐藏,因为抛出异常时系统会继续重试该作业,如果隐藏异常,系统会认为作业正常执行。

队列作业

作业代码完成后,需要通过队列的方式进行调用,此时可使用 IBackgroundJobManager 服务去管理队列。

public class RegistrationService:ApplicationService
{
    private readonly IBackgroundJobManager _backgroundJobManager;
    public RegistrationService(IBackgroundJobManager backgroundJobManager)
    {
        _backgroundJobManager = backgroundJobManager;
    }
    /// <summary>
    /// 将要执行的任务放在队列中,然后进行作业
    /// </summary>
    /// <param name="student"></param>
    /// <returns></returns>
    public async Task RegisterAsync(Student student) { 
        await _backgroundJobManager.EnqueueAsync(student);  
    }
}

作业配置

[DependsOn(typeof(AbpBackgroundJobsModule))]
public class StopJobModule : AbpModule
{
    public override void ConfigureServices(ServiceConfigurationContext context)
    {
        // 禁用作业执行
        Configure<AbpBackgroundJobOptions>(options =>
        {
            options.IsJobExecutionEnabled = false; 
        });
        // 更改后台作业的的超时时间
        Configure<AbpBackgroundJobWorkerOptions>(options =>
        {
            options.DefaultTimeout = 864000; //86400秒
        });
    }
}