无法创建带有 Quartz.NET 触发器的作业



我有一个使用 Quartz.NET 来计划作业的 .NET Core 3 辅助角色服务。在这个精简的示例中,我有一个带有单个触发器的作业。它似乎没有运行,我没有得到任何例外。

  • 如何调试 Quartz.NET 并获取作业和触发器列表?
  • 为什么以下示例中的作业没有运行?

我尝试在组内创建作业和触发器,但没有组,但没有任何效果。

public class Worker : BackgroundService
{
    private readonly ILogger<Worker> _logger;
    private readonly ISchedulerFactory _schedulerFactory;
    public Worker(ILogger<Worker> logger, ISchedulerFactory schedulerFactory)
    {
        _logger = logger;
        _schedulerFactory = schedulerFactory;
    }
    protected override async Task ExecuteAsync(CancellationToken stoppingToken)
    {
        NameValueCollection props = new NameValueCollection
        {
            { "quartz.serializer.type", "binary" }
        };
        StdSchedulerFactory factory = new StdSchedulerFactory(props);
        IScheduler schedulder = await factory.GetScheduler().ConfigureAwait(false);
        await schedulder.Start().ConfigureAwait(false);
        var pingJob = JobBuilder.Create<PingJob>()
            .WithIdentity("ping-job")
            .Build();
        ITrigger pingJob1Trigger = TriggerBuilder.Create()
            .WithIdentity("ping-job")
            .WithSimpleSchedule(x => x
                .WithInterval(TimeSpan.FromSeconds(1))
                .RepeatForever())
            .StartNow()
            .Build();
        await schedulder.ScheduleJob(pingJob, pingJob1Trigger, stoppingToken).ConfigureAwait(false);
    }
}

工作:

public class PingJob : IJob
{
    private readonly ILogger<PingJob> _logger;
    public PingJob(ILogger<PingJob> logger)
    {
        _logger = logger;
    }
    public async Task Execute(IJobExecutionContext context)
    {
        _logger.LogInformation("Ping");

        await Task.CompletedTask;
    }
}

Quartz 将使用默认的无参数构造函数创建作业。在当前PingJob构造中设置断点,启动调试器并观察不会命中断点。

以下是描述此行为的文档的相关部分:

当触发器触发时,它关联的作业将通过以下方式实例化 在调度程序上配置的作业工厂。默认的作业工厂 只需激活作业类的新实例。你可能想要 创建您自己的JobFactory实现来完成诸如 让应用程序的 IoC 或 DI 容器生成/初始化 作业实例。

请参阅 IJobFactory 接口和关联的 Scheduler.SetJobFactory(fact( 方法。

现在添加一个无参数构造函数

public PingJob() 
{ 
}

在其中设置断点,启动调试器,它将被命中。您还可以在 Execute 方法中设置断点,现在也会命中断点。

您现在可以按如下方式替换 Execute 方法,它将在控制台上打印Ping

public async Task Execute(IJobExecutionContext context)
{
    await Console.Out.WriteLineAsync("Ping");
}

我们如何让您的原始代码正常工作?正如文档所说,我们需要使用 JobFactory .例如,请参阅堆栈溢出问题 .net 核心石英依赖注入

最新更新