Quartz后台任务管理器
Quartz是一款高级的后台任务管理工具。您可以将Quartz与ABP框架集成,替代 默认的后台任务管理器。ABP框架对Quartz的集成非常简便。
安装指南
建议使用 ABP CLI 进行包安装。
使用ABP CLI安装
在项目文件夹(.csproj文件所在目录)中打开命令行窗口,输入以下命令:
abp add-package Volo.Abp.BackgroundWorkers.Quartz
手动安装步骤
如需手动安装:
添加Volo.Abp.BackgroundWorkers.Quartz NuGet包至项目:
dotnet add package Volo.Abp.BackgroundWorkers.Quartz在模块的依赖列表中添加
AbpBackgroundWorkersQuartzModule:
[DependsOn(
//...其他依赖项
typeof(AbpBackgroundWorkersQuartzModule) //添加新模块依赖
)]
public class YourModule : AbpModule
{
}
Quartz后台任务集成提供了
QuartzPeriodicBackgroundWorkerAdapter,用于适配继承自PeriodicBackgroundWorkerBase和AsyncPeriodicBackgroundWorkerBase的类。因此您仍可按照 后台任务文档 定义后台任务。
配置说明
详见 配置指南 。
创建后台任务
后台任务是一个继承自 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官方文档。
抠丁客


