问题描述
我想知道Quartz.Net是否有办法告知(或更好地在日志中)下次执行...我的意思是,我有一份工作在上午10:00运行,并且已计划运行每两个小时...有什么办法可以写一些内容,例如Next在12:00 AM运行?还是我必须解析cron表达式,然后将其添加到当前日期? 预先感谢
解决方法
不确定您使用的是哪种记录器,但是这种方法应该可以与您可以创建实例的任何记录器一起使用。创建记录器实例,并将其通过JobDataMap
传递给作业,然后在作业内部使用它。 IJobExecutionContext.NextFireTimeUtc
会告诉您下一次执行时间,您可以将其写入记录器
using System;
using System.Threading.Tasks;
using NLog;
using Quartz;
using Quartz.Impl;
namespace QuartzSampleApp
{
public class Program
{
private static async Task Main(string[] args)
{
var logger = LogManager.GetCurrentClassLogger();
StdSchedulerFactory factory = new StdSchedulerFactory();
IScheduler scheduler = await factory.GetScheduler();
await scheduler.Start();
IJobDetail job = JobBuilder.Create<HelloJob>()
.WithIdentity("job1","group1")
.Build();
job.JobDataMap["logger"] = logger; // add logger to job data map
ITrigger trigger = TriggerBuilder.Create()
.WithIdentity("trigger1","group1")
.StartNow()
.WithSimpleSchedule(x => x
.WithIntervalInSeconds(10)
.RepeatForever())
.Build();
await scheduler.ScheduleJob(job,trigger);
await Task.Delay(TimeSpan.FromSeconds(60));
await scheduler.Shutdown();
Console.WriteLine("Press any key to close the application");
Console.ReadKey();
}
// simple log provider to get something to the console
}
public class HelloJob : IJob
{
public async Task Execute(IJobExecutionContext context)
{
await Console.Out.WriteLineAsync("Greetings from HelloJob!");
var logger = context.JobDetail.JobDataMap["logger"] as ILogger;
logger.Log(LogLevel.Info,"Next job execution at " + context.NextFireTimeUtc);
}
}
}