我有一个使用 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 核心石英依赖注入