无法使用Quartz.NET的触发器创建作业

时间:2019-11-23 11:20:45

标签: c# 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;
    }
}

1 个答案:

答案 0 :(得分:0)

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

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

  

触发触发器时,通过实例化与之关联的作业   在调度程序上配置的JobFactory。默认的JobFactory   只需激活作业类的新实例。您可能要   创建自己的JobFactory实现以完成诸如此类的任务   如让您的应用程序的IoC或DI容器产生/初始化   工作实例。

     

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

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

public PingJob() 
{ 
}

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

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

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

我们如何使您的原始代码起作用?如文档所述,我们需要使用JobFactory。参见例如stackoverflow问题.net Core Quartz Dependency Injection