使用 StartAt() 在池启动时执行 Quartz 作业
Quartz job excecuted at pool startup with StartAt()
我使用 quartz 一段时间来重复任务,效果很好。出于某种原因,我需要创建一个在特定的两天 运行 的任务。这是我所做的实现:
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
,触发器在启动时触发一次。根据此信息,有两个选项:
- 使用
EndAt()
设置结束值 - 快速而干净
- 用日期检查围绕初始化 - 下一个 reader 的重要解决方案,但避免无用的作业注册。
我使用 quartz 一段时间来重复任务,效果很好。出于某种原因,我需要创建一个在特定的两天 运行 的任务。这是我所做的实现:
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
,触发器在启动时触发一次。根据此信息,有两个选项:
- 使用
EndAt()
设置结束值 - 快速而干净 - 用日期检查围绕初始化 - 下一个 reader 的重要解决方案,但避免无用的作业注册。