【问题标题】:Schedule task to run everyday at specific time with Quartz.NET使用 Quartz.NET 安排任务每天在特定时间运行
【发布时间】:2013-06-25 05:11:04
【问题描述】:

我每天在特定时间使用 Quartz.NET 执行一项任务,这是我的代码:

public class TestSchedule : ISchedule
    {
        public void Run()
        {

            DateTimeOffset startTime = DateBuilder.FutureDate(2, IntervalUnit.Second);

            IJobDetail job = JobBuilder.Create<HelloJob>()
                                       .WithIdentity("job1")
                                       .Build();

            ITrigger trigger = TriggerBuilder.Create()
                                             .WithIdentity("trigger1")
                                             .StartAt(startTime)
                                             .WithDailyTimeIntervalSchedule(x => x.OnEveryDay().StartingDailyAt(new TimeOfDay(7, 0)).WithRepeatCount(0))
                                             .Build();

            ISchedulerFactory sf = new StdSchedulerFactory();
            IScheduler sc = sf.GetScheduler();
            sc.ScheduleJob(job, trigger);

            sc.Start();
        }
    }

我的代码正在运行,但问题是它只能运行一次(似乎是因为WithRepeatCount(0)) 现在,怎么能说每天 7 点钟运行呢?
PS : 我不想用CronTrigger 那样做。

【问题讨论】:

    标签: quartz-scheduler quartz.net


    【解决方案1】:

    DailyTimeIntervalTriggerImpl 仅支持 repeatCount

    此触发器还支持“repeatCount”功能来结束触发器 达到一定计数后的触发时间。就像 SimpleTrigger,设置repeatCount=0意味着触发器将触发一次 只要!设置任何正计数,然后触发器将重复计数 + 1次。与 SimpleTrigger 不同,repeatCount 的默认值为 此触发器设置为 REPEAT_INDEFINITELY 而不是 0。

    Cron 表达式很漂亮,并且有大量的 tools 可以帮助您实现所需的内容。

    另一种选择是使用 SimpleTriggerImpl 并设置每 24 小时的间隔:

    ITrigger trigger = TriggerBuilder.Create()
            .WithIdentity("trigger1")
            .StartAt(startTime)
            .WithSimpleSchedule(x => x.RepeatForever().WithIntervalInHours(24))
            .Build();
    

    【讨论】:

    • 另一种解决方案是.EndingDailyAfterCount(1),而不是.WithIntervalInHours(24)。这样您就不会遇到与 DST(夏令时)相关的问题。
    • 每天凌晨 2:00 的时间怎么说? startTime 是 DateTime 类型,我们还需要提及日期是否正确?
    • @Sebastian:这取决于您使用的 Quartz.net 版本。自从我发布这个答案以来,很多事情都发生了变化。我在此示例中使用的版本将接受 DateTimeOffset 用于方法 StartAt。只要您添加时间,DateTime 字段也可以。每 24 小时跑步一次会尊重您的日程安排。