我有一个使用Quartz.NET安排作业的.NET Core 3辅助服务。在这个简化的示例中,我只有一个触发器。它似乎没有运行,而且我也没有任何异常。
我尝试在一个小组内创建作业并触发,没有一个小组则没有效果。
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;
}
}
答案 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