当前位置: 首页 > 工具软件 > Quartz Web > 使用案例 >

NET - .NET Core 之 Abp 整合 Quartz

田博超
2023-12-01

介绍

Quartz是一个功能齐全、开源的作业调度系统,从最小的应用程序到大型企业系统都可以使用。

Abp模板工程中已经整合了Abp.Quartz包

 

ASP.NET模板文件有一个内置的持久后台作业队列和后台工作程序系统。如果你对你的后台工作人员有高级的调度要求,Quartz可以是一个不错的选择。Hangfire也可以是持久后台作业队列的一个很好的替代方案。

 

安装

将abp.quartz的NuGet包安装到你的项目中,并为你的模块AbpQuartzModule添加DependsOn属性:

[DependsOn(typeof (AbpQuartzModule))]
public class YourModule : AbpModule
{
    //...
}

 

创建Job

要创建一个新作业,您可以实现Quartz的IJob接口,或者从JobBase类(定义在Abp.Quartz包中)派生,该类具有一些用于日志记录和本地化的helper属性/方法。一个简单的作业类如下所示:

public class MyLogJob : JobBase, ITransientDependency
{
    public override Task Execute(IJobExecutionContext context)
    {
        Logger.Info("Executed MyLogJob..!");
        return Task.CompletedTask;
    }
}

 

Schedule Jobs

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!");
    }
}   

 

遇到的问题

  1. 运行工程提示No Compant "Abp.xxxx.Configuration" was found.
  2. 运行工程提示No Compant "Abp.xxxx.IRepository" was found.

 

 

以上两个问题都是因为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());


}

 

 类似资料: