显示下一个作业执行的预定时间

问题描述

我想知道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);
        }
    }
}