Quartz是一个功能齐全、开源的作业调度系统,从最小的应用程序到大型企业系统都可以使用。
Abp模板工程中已经整合了Abp.Quartz包
ASP.NET模板文件有一个内置的持久后台作业队列和后台工作程序系统。如果你对你的后台工作人员有高级的调度要求,Quartz可以是一个不错的选择。Hangfire也可以是持久后台作业队列的一个很好的替代方案。
将abp.quartz的NuGet包安装到你的项目中,并为你的模块AbpQuartzModule添加DependsOn属性:
[DependsOn(typeof (AbpQuartzModule))]
public class YourModule : AbpModule
{
//...
}
要创建一个新作业,您可以实现Quartz的IJob接口,或者从JobBase类(定义在Abp.Quartz包中)派生,该类具有一些用于日志记录和本地化的helper属性/方法。一个简单的作业类如下所示:
public class MyLogJob : JobBase, ITransientDependency
{
public override Task Execute(IJobExecutionContext context)
{
Logger.Info("Executed MyLogJob..!");
return Task.CompletedTask;
}
}
IQuartzScheduleJobManager用于调度作业。您可以将它注入到您的类中(或者您可以解析它并在模块的PostInitialize方法中使用它)来调度作业。调度作业的控制器示例:
public class HomeController : AbpController
{
private readonly IQuartzScheduleJobManager _jobManager;
public HomeController(IQuartzScheduleJobManager jobManager)
{
_jobManager = jobManager;
}
public async Task<ActionResult> ScheduleJob()
{
await _jobManager.ScheduleAsync<MyLogJob>(
job =>
{
job.WithIdentity("MyLogJobIdentity", "MyGroup")
.WithDescription("A job to simply write logs.");
},
trigger =>
{
trigger.StartNow()
.WithSimpleSchedule(schedule =>
{
schedule.RepeatForever()
.WithIntervalInSeconds(5)
.Build();
});
});
return Content("OK, scheduled!");
}
}
以上两个问题都是因为AbpModule类上缺少DependsOn, 补充以下Depends
[DependsOn(
typeof(EdgeServerApplicationModule),
typeof(EdgeServerEntityFrameworkCoreModule),
typeof(AbpAspNetCoreModule),
typeof(AbpQuartzModule))]
public class XXXBackgroundTasksModule : AbpModule
{
注意:要在AbpModule中的Initialize方法中,替换数据库默认的连接字符串
public override void Initialize()
{
Configuration.DefaultNameOrConnectionString = _appConfiguration.GetConnectionString(XXXConsts.ConnectionStringName);
IocManager.RegisterAssemblyByConvention(typeof(XXXBackgroundTasksModule).GetAssembly());
}