版本
语言

Quartz 后台工作者管理

Quartz是一个高级的后台工作者管理. 你可以用ABP框架集成Quartz代替默认后台工作者管理. ABP简单的集成了Quartz.

安装

建议使用ABP CLI安装包.

使用ABP CLI

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

abp add-package Volo.Abp.BackgroundWorkers.Quartz

手动安装

如果你想手动安装;

  1. 添加 Volo.Abp.BackgroundWorkers.Quartz NuGet包添加到你的项目:

    Install-Package Volo.Abp.BackgroundWorkers.Quartz
    
  2. 添加 AbpBackgroundWorkersQuartzModule 到你的模块的依赖列表:

[DependsOn(
    //...other dependencies
    typeof(AbpBackgroundWorkersQuartzModule) //Add the new module dependency
    )]
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("Executed MyLogWorker..!");
        return Task.CompletedTask;
    }
}

示例中我们重写了 Execute 方法写入日志. 后台工作者默认是单例. 如果你需要,也可以实现依赖接口将其注册为其他的生命周期.

提示: 为后台工作者添加标识是最佳实践,Quartz根据标识区分作业. 如果未指定标识会重复添加工作者到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("Executed MyLogWorker..!");
        return Task.CompletedTask;
    }
}

尽管你可以使用 AutoRegister 跳过自动添加,但如果你想要全局禁用这样会比较繁琐. 你可以通过 AbpBackgroundWorkerQuartzOptions 选项全局禁用:

[DependsOn(
    //...other dependencies
    typeof(AbpBackgroundWorkersQuartzModule) //Add the new module dependency
    )]
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("Executed MyLogWorker..!");
        return Task.CompletedTask;
    }
}

在示例中我们定义了工作者执行间隔为10分钟,并且设置 WithMisfireHandlingInstructionIgnoreMisfires ,另外自定义 ScheduleJob 仅当工作者不存在时向quartz添加调度作业.

更多

参阅Quartz文档了解更多信息.

本页对您有帮助吗?
请进行选择。
感谢您的宝贵意见!

请注意,虽然我们无法回复反馈意见,但我们的团队会根据您的意见改进体验。

在本文档中
Mastering ABP Framework Book
掌握 ABP 框架

本书将帮助你全面了解框架和现代Web应用程序开发技术。