项目

Quartz 后台作业管理器

Quartz 是一个高级的后台作业管理器。您可以将 Quartz 与 ABP 集成,用它替代 默认的后台作业管理器 。这样,您可以使用统一的后台作业 API,使代码与 Quartz 解耦。当然,如果您愿意,也可以直接使用 Quartz 的 API。

关于如何使用后台作业系统,请参阅 后台作业文档 。本文档仅介绍如何安装和配置 Quartz 集成。

安装

建议使用 ABP CLI 来安装此包。

使用 ABP CLI

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

abp add-package Volo.Abp.BackgroundJobs.Quartz

如果您尚未安装 ABP CLI,请先进行安装。其他安装方式请参阅 包详情页面

手动安装

如需手动安装:

  1. Volo.Abp.BackgroundJobs.Quartz NuGet 包添加到您的项目:

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

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

配置

Quartz 是一个高度可配置的库,ABP 为此提供了 AbpQuartzOptions。您可以在模块类中使用 PreConfigure 方法预先配置此选项。ABP 在初始化 Quartz 模块时会使用该配置。例如:

[DependsOn(
    //...其他依赖
    typeof(AbpBackgroundJobsQuartzModule) //添加新模块依赖
    )]
public class YourModule : AbpModule
{
    public override void PreConfigureServices(ServiceConfigurationContext context)
    {
        var configuration = context.Services.GetConfiguration();

        PreConfigure<AbpQuartzOptions>(options =>
        {
            options.Properties = new NameValueCollection
            {
                ["quartz.jobStore.dataSource"] = "BackgroundJobsDemoApp",
                ["quartz.jobStore.type"] = "Quartz.Impl.AdoJobStore.JobStoreTX, Quartz",
                ["quartz.jobStore.tablePrefix"] = "QRTZ_",
                ["quartz.serializer.type"] = "json",
                ["quartz.dataSource.BackgroundJobsDemoApp.connectionString"] = configuration.GetConnectionString("Quartz"),
                ["quartz.dataSource.BackgroundJobsDemoApp.provider"] = "SqlServer",
                ["quartz.jobStore.driverDelegateType"] = "Quartz.Impl.AdoJobStore.SqlServerDelegate, Quartz",
            };
        });
    }
}

从 ABP 3.1 版本开始,我们向 AbpQuartzOptions 添加了 Configurator 用于配置 Quartz。例如:

[DependsOn(
    //...其他依赖
    typeof(AbpBackgroundJobsQuartzModule) //添加新模块依赖
    )]
public class YourModule : AbpModule
{
    public override void PreConfigureServices(ServiceConfigurationContext context)
    {
        var configuration = context.Services.GetConfiguration();

        PreConfigure<AbpQuartzOptions>(options =>
        {
            options.Configurator = configure =>
            {
                configure.UsePersistentStore(storeOptions =>
                {
                    storeOptions.UseProperties = true;
                    storeOptions.UseJsonSerializer();
                    storeOptions.UseSqlServer(configuration.GetConnectionString("Quartz"));
                    storeOptions.UseClustering(c =>
                    {
                        c.CheckinMisfireThreshold = TimeSpan.FromSeconds(20);
                        c.CheckinInterval = TimeSpan.FromSeconds(10);
                    });
                });
            };
        });
    }
}

您可以选择自己喜欢的方式来配置 Quartz。

Quartz 默认将作业和调度信息存储在内存中。上述示例中,我们通过选项模式的预配置将其改为数据库存储。更多 Quartz 配置请参考 Quartz 的官方文档

异常处理

默认异常处理策略

当后台作业发生异常时,ABP 提供默认处理策略:每 3 秒重试一次,最多重试 3 次。您可以通过 AbpBackgroundJobQuartzOptions 选项更改重试次数和重试间隔:

[DependsOn(
    //...其他依赖
    typeof(AbpBackgroundJobsQuartzModule) //添加新模块依赖
    )]
public class YourModule : AbpModule
{
    public override void ConfigureServices(ServiceConfigurationContext context)
    {
        Configure<AbpBackgroundJobQuartzOptions>(options =>
        {
            options.RetryCount = 1;
            options.RetryIntervalMillisecond = 1000;
        });
    }
}

自定义异常处理策略

您可以通过 AbpBackgroundJobQuartzOptions 选项自定义异常处理策略:

[DependsOn(
    //...其他依赖
    typeof(AbpBackgroundJobsQuartzModule) //添加新模块依赖
    )]
public class YourModule : AbpModule
{
    public override void ConfigureServices(ServiceConfigurationContext context)
    {
        Configure<AbpBackgroundJobQuartzOptions>(options =>
        {
            options.RetryStrategy = async (retryIndex, executionContext, exception) =>
            {
                // 自定义异常处理逻辑
            };
        });
    }
}
在本文档中