【问题标题】:Scheduling Cron Jobs With Quartz.NET使用 Quartz.NET 调度 Cron 作业
【发布时间】:2013-02-01 11:28:47
【问题描述】:

我正在尝试使用 Quartz.NET 安排一些工作,但我无法让它工作。我尝试了以下代码,但在指定时间到达时没有任何反应。

    public void Test()
    {
        ISchedulerFactory schedulerFactory = new StdSchedulerFactory();
        IScheduler scheduler = schedulerFactory.GetScheduler();

        IJobDetail jobDetail = JobBuilder.Create<SatellitePaymentGenerationJob>()
            .WithIdentity("TestJob")
            .Build();
        ITrigger trigger = TriggerBuilder.Create()
            .ForJob(jobDetail)
            .WithCronSchedule("0 26 18 * * ?")
            .WithIdentity("TestTrigger")
            .StartNow()
            .Build();
        scheduler.ScheduleJob(jobDetail, trigger);
        scheduler.Start();
    }

更新:

我还尝试了以下操作,以确保不是 Cron 表达式导致问题。也不适合我...

IJobDetail jobDetail = JobBuilder.Create<SatellitePaymentGenerationJob>()
                .WithIdentity("TestJob", "TestGroup")
                .Build();
            ITrigger trigger = TriggerBuilder.Create()  
                .ForJob(jobDetail)
                .WithSimpleSchedule(x=> x.RepeatForever().WithIntervalInSeconds(10).WithMisfireHandlingInstructionFireNow())
                .StartAt(new DateTimeOffset(DateTime.UtcNow.AddSeconds(10)))
                .WithIdentity("TestTrigger", "TestGroup")
                .Build();
            scheduler.ScheduleJob(jobDetail, trigger);
            scheduler.Start();
            Console.WriteLine(DateTime.UtcNow.ToLongTimeString());
            Console.WriteLine(trigger.GetNextFireTimeUtc());

请注意,trigger.GetNextFireTimeUtc() 返回一个有效的时间值,但该作业永远不会被触发。

我哪里做错了?

【问题讨论】:

    标签: c# quartz-scheduler jobs quartz.net quartz.net-2.0


    【解决方案1】:

    您的示例代码一切正常,可能是 SatellitePaymentGenerationJob 实现中的 Execute 方法错误,或者作业已执行但未在预期时间执行。以现在的形态,每天18:26开火,是你想要的吗?

    与我的代码比较(工作):

    class Program
    {
        static void Main(string[] args)
        {
            Test();
        }
    
        public static void Test()
        {
            ISchedulerFactory schedulerFactory = new StdSchedulerFactory();
            IScheduler scheduler = schedulerFactory.GetScheduler();
    
            IJobDetail jobDetail = JobBuilder.Create<SatellitePaymentGenerationJob>()
                .WithIdentity("TestJob")
                .Build();
            ITrigger trigger = TriggerBuilder.Create()
                .ForJob(jobDetail)
                .WithCronSchedule("0 45 20 * * ?")
                .WithIdentity("TestTrigger")
                .StartNow()
                .Build();
            scheduler.ScheduleJob(jobDetail, trigger);
            scheduler.Start();
        }
    }
    
    internal class SatellitePaymentGenerationJob : IJob
    {
        public void Execute(IJobExecutionContext context)
        {
            Console.WriteLine("test");
        }
    }
    

    【讨论】:

    • 是的,这就是目的。我刚刚将它设置为每天 20:00 运行(现在按照我的时区),但什么也没发生。 Execute 方法开头的断点没有命中。有什么想法吗?
    • 您是否在应用程序中调用了 Test() 方法?
    • 当然可以。我在控制台应用程序的Main 方法中调用它。我还尝试了基于间隔的触发器(正如您在更新的问题中看到的那样),但它也不起作用。
    • 好吧,我终于搞定了。显然,问题在于实现IJob 接口的作业,因为它没有默认构造函数。我猜我需要内联初始化依赖项(而不是通过构造函数参数来完成)。感谢您的帮助:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-09
    • 1970-01-01
    • 1970-01-01
    • 2021-12-27
    • 2020-09-20
    相关资源
    最近更新 更多