首页 > 解决方案 > 石英作业未开始

问题描述

我正在尝试使用 Abp.Quartz 来安排作业。

使用 net core 2.2、abp 4.5

我在 https://aspnetboilerplate.com/Pages/Documents/Quartz-Integration的文档中做了所有事情,只在 PostInitialize 方法中解决了它。

最后,我尝试了与文档中完全相同的方法(从控制器启动调度程序)。

但它也没有奏效。作业未开始。

namespace Cloud
{
    [DependsOn(typeof(AbpZeroCoreModule),
               typeof(AbpQuartzModule))]
    public class CloudCoreModule : AbpModule
    {
        public override void PreInitialize()
        {
        }

        public override void Initialize()
        {            
            IocManager.RegisterAssemblyByConvention(typeof(CloudCoreModule)
                      .GetAssembly());
        }

        public override void PostInitialize()
        {
             IocManager.Resolve<IQuartzScheduleJobManager>().ScheduleAsync<ApiRequestQueues.ApiRequestProcessor>(
                job =>
                {
                    job
                      .WithIdentity("RevolutApiProcessor")
                      .WithDescription("A job witch processing request front");
                },
                trigger =>
                {
                    trigger
                        .StartNow()
                        .WithSimpleSchedule(
                            schedule =>
                            {
                                schedule
                                    .RepeatForever()
                                    .WithIntervalInSeconds(5)
                                    .Build();
                            });

                });
        }
    }
}

这是类 ApiRequestProcessor

public class ApiRequestProcessor : JobBase, ITransientDependency
{
    public override async Task Execute(IJobExecutionContext context)
    {
     //some work
    }
}

标签: c#moduleautostartquartzabp

解决方案


迟到总比没有好。

我已经设法让这个工作,虽然没有Abp.Quartz包。如果您能够使用标准Quartz包,则可以使用以下步骤:

  1. 像往常一样定义和设置您的工作Startup.cs
  2. 确保你的类实现了IJob快乐QuartzITransientDependencyASP.NET Boilerplate
  3. 非常重要,如果您的作业代码DbContext以任何方式使用,您需要确保[UnitOfWork]装饰器在您的作业类上(这对于确保您的作业以原子方式运行并且不影响可能在您的服务器上发生的任何其他事务非常重要)

简而言之,一个基本的工作类可能看起来像这样:

using System;
using Quartz;

namespace MyProject.MyJobService
{
    [UnitOfWork]
    public class SimpleJob : IJob, ITransientDependency
    {
        public async Task Execute(IJobExecutionContext context)
        { 
            Console.WriteLine("Hello from quartz job!");
        }
    }
}

更多信息和讨论可以在这里找到(也是我最终如何得出这个解决方案):https ://github.com/aspnetboilerplate/aspnetboilerplate/issues/3757

如有疑问,请仔细阅读 Quartz 在应用程序输出中告诉您的内容 - 它通常会提供有关问题所在的线索,但我相信我的解决方案会为您工作


推荐阅读