项目

Quartz后台任务管理器

Quartz是一款高级的后台任务管理工具。您可以将Quartz与ABP框架集成,替代 默认的后台任务管理器。ABP框架对Quartz的集成非常简便。

安装指南

建议使用 ABP CLI 进行包安装。

使用ABP CLI安装

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

abp add-package Volo.Abp.BackgroundWorkers.Quartz

手动安装步骤

如需手动安装:

  1. 添加Volo.Abp.BackgroundWorkers.Quartz NuGet包至项目:

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

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

Quartz后台任务集成提供了 QuartzPeriodicBackgroundWorkerAdapter,用于适配继承自 PeriodicBackgroundWorkerBaseAsyncPeriodicBackgroundWorkerBase 的类。因此您仍可按照 后台任务文档 定义后台任务。

配置说明

详见 配置指南

创建后台任务

后台任务是一个继承自 QuartzBackgroundWorkerBase 基类的类。例如,下面展示了一个简单的任务类:

public class MyLogWorker : QuartzBackgroundWorkerBase
{
    public MyLogWorker()
    {
        JobDetail = JobBuilder.Create<MyLogWorker>().WithIdentity(nameof(MyLogWorker)).Build();
        Trigger = TriggerBuilder.Create().WithIdentity(nameof(MyLogWorker)).StartNow().Build();
    }

    public override Task Execute(IJobExecutionContext context)
    {
        Logger.LogInformation("MyLogWorker已执行..!");
        return Task.CompletedTask;
    }
}

我们通过重写Execute方法实现了日志记录功能。后台任务默认采用单例模式。如需其他生命周期,可额外实现依赖注入接口

提示:为后台任务设置标识符是最佳实践,因为Quartz通过标识符区分不同任务。

添加到BackgroundWorkerManager

默认情况下,后台任务会在应用初始化时自动添加到BackgroundWorkerManager。如需手动添加,可将AutoRegister属性设为false

public class MyLogWorker : QuartzBackgroundWorkerBase
{
    public MyLogWorker()
    {
        AutoRegister = false;
        JobDetail = JobBuilder.Create<MyLogWorker>().WithIdentity(nameof(MyLogWorker)).Build();
        Trigger = TriggerBuilder.Create().WithIdentity(nameof(MyLogWorker)).StartNow().Build();
    }

    public override Task Execute(IJobExecutionContext context)
    {
        Logger.LogInformation("MyLogWorker已执行..!");
        return Task.CompletedTask;
    }
}

如需全局禁用自动注册功能,可通过AbpBackgroundWorkerQuartzOptions配置项实现:

[DependsOn(
    //...其他依赖项
    typeof(AbpBackgroundWorkersQuartzModule) //添加新模块依赖
    )]
public class YourModule : AbpModule
{
    public override void ConfigureServices(ServiceConfigurationContext context)
    {
        Configure<AbpBackgroundWorkerQuartzOptions>(options =>
        {
            options.IsAutoRegisterEnabled = false;
        });
    }
}

高级主题

自定义ScheduleJob

假设某任务需每10分钟执行一次,但因服务器故障导致30分钟内错过3次执行。您希望服务器恢复后补执行所有错过任务,可按如下方式定义:

public class MyLogWorker : QuartzBackgroundWorkerBase
{
    public MyLogWorker()
    {
        JobDetail = JobBuilder.Create<MyLogWorker>().WithIdentity(nameof(MyLogWorker)).Build();
        Trigger = TriggerBuilder.Create().WithIdentity(nameof(MyLogWorker)).WithSimpleSchedule(s=>s.WithIntervalInMinutes(1).RepeatForever().WithMisfireHandlingInstructionIgnoreMisfires()).Build();

        ScheduleJob = async scheduler =>
        {
            if (!await scheduler.CheckExists(JobDetail.Key))
            {
                await scheduler.ScheduleJob(JobDetail, Trigger);
            }
        };
    }

    public override Task Execute(IJobExecutionContext context)
    {
        Logger.LogInformation("MyLogWorker已执行..!");
        return Task.CompletedTask;
    }
}

本示例将任务执行间隔设置为10分钟,并配置了WithMisfireHandlingInstructionIgnoreMisfires策略。通过自定义ScheduleJob方法,确保仅当后台任务不存在时才将其加入Quartz调度器。

扩展阅读

更多详细信息请参阅Quartz官方文档

在本文档中