使用 StartAt() 在池启动时执行 Quartz 作业

Quartz job excecuted at pool startup with StartAt()

我使用 一段时间来重复任务,效果很好。出于某种原因,我需要创建一个在特定的两天 运行 的任务。这是我所做的实现:

IScheduler scheduler = StdSchedulerFactory.GetDefaultScheduler();
scheduler.Start();

IJobDetail jobWeekEnd = JobBuilderExtend.Create<CreateConsultationReplayJob>(() => new StandardContextProvider());
ITrigger triggerWeekend = TriggerBuilder.Create()
                                        .WithIdentity("Foo", "Bar")
                                        .WithCronSchedule("0 0 9 ? * SAT-SUN")
                                        .ForJob(jobWeekEnd)
                                        .Build();

scheduler.ScheduleJob(jobWeekEnd, triggerWeekend); // WORKS WELL

var jobNonWorkingDay = JobBuilderExtend.Create<CreateConsultationReplayJob>(() => new StandardContextProvider());
var trigger1 = TriggerBuilder.Create()
                             .WithIdentity("Foo2", "Bar")
                             .StartAt(new DateTimeOffset(new DateTime(2017, 04, 17, 09, 00, 00)))
                             .ForJob(jobNonWorkingDay)
                             .Build();
scheduler.ScheduleJob(jobNonWorkingDay, trigger1);

var jobNonWorkingDay2 = JobBuilderExtend.Create<CreateConsultationReplayJob>(() => new StandardContextProvider());
var trigger2 = TriggerBuilder.Create()
                              .WithIdentity("Foo3", "Bar3")
                              .StartAt(new DateTimeOffset(new DateTime(2017, 05, 01, 09, 00, 00)))
                              .ForJob(jobNonWorkingDay2)
                              .Build();
scheduler.ScheduleJob(jobNonWorkingDay2, trigger2);

trigger1 和 trigger2 似乎没有在正确的时间触发,但每次我回收池时,随机地,最后一次出现在 11:16:15。

关于我应该在哪里挖掘的任何线索?

由于第一个调度程序的日期是过去的 (new DateTime(2017, 04, 17, 09, 00, 00)) 并且没有定义 EndAt,触发器在启动时触发一次。根据此信息,有两个选项:

  1. 使用 EndAt() 设置结束值 - 快速而干净
  2. 用日期检查围绕初始化 - 下一个 reader 的重要解决方案,但避免无用的作业注册。