通过Quartz.NET安排任务在特定时间每天运行

Sir*_*ifi 4 quartz-scheduler quartz.net

我每天使用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();
        }
    }
Run Code Online (Sandbox Code Playgroud)

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

Lef*_*tyX 6

DailyTimeIntervalTriggerImpl仅支持repeatCount

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

Cron表达式很漂亮,并且有很多工具可以帮助您实现所需的功能。

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

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

  • 另一种解决方案是`.EndingDailyAfterCount(1)` 而不是`.WithIntervalInHours(24)`。因此,您不会遇到 DST(夏令时)相关问题的麻烦。 (2认同)