本文共 2300 字,大约阅读时间需要 7 分钟。
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 TaskScheduleJob() { await _jobManager.ScheduleAsync ( 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());}
转载地址:http://amnci.baihongyu.com/