(Отказ от ответственности: это уже размещено на github.com/quartznet, но раздел вопросов выглядит для меня немного осиротевшим)
При использовании CronTrigger ("0 * / 5 *? * * *") В простой среде с одним планировщиком / одним триггером / одним заданием после первого выполнения задания триггеры NextFireTime не продвигаются и остаются в прошлом. Кажется, что каждая запланированная работа выполняется немедленно.
У меня есть CronTrigger, который должен запускать только одну работу каждые пять минут. Работа изначально запланирована. В течение каждого пятиминутного интервала могут происходить события, которые требуют обновления JobDataMap, поэтому может происходить много перепланировок. Мое объяснение таково: последнее (пере) запланированное задание до того, как NextFireTime достигнуто, «выигрывает» и выполняется. Я ожидаю, что это будет происходить каждые 5 минут.
Проблема: это не то, что я вижу. До первого исполнения все вроде бы нормально. После этого кажется, что триггер не продвигается к тому, что я ожидаю, чтобы быть NextFireTime; вместо этого он остается с последним, который находится в прошлом сейчас. На данный момент, похоже, что каждое запланированное задание выполняется немедленно, а не в ожидании следующего NextFireTime.
Во время этой записи я чувствую, что мой дизайн, основанный на интенсивном перепланировании, немного дурацкий. Чего я действительно хочу добиться, так это захватить состояние некоторых объектов непосредственно перед срабатыванием определенного триггера и работать с этим состоянием в Job.Execute (). Есть ли лучший способ?
Что я пробовал до сих пор:
- replace = true для Scheduler.ScheduleJob ()
- использование одного объекта триггера против воссоздания его с каждым перепланированием
- Очистка всего от Планировщика перед перепланированием
- CronSchedule с WithMisfireHandlingInstructionDoNothing ()
- убедиться, что в Job.Execute нет исключений, которые могут вызвать повторное выполнение
Экстренное Определение:
jobExecutionTrigger = TriggerBuilder.Create()
.WithIdentity("trigger1", "group1")
.WithCronSchedule("0 */5 * ? * * *",
cs => cs.WithMisfireHandlingInstructionDoNothing())
.Build();
Первоначальный шаблон задания
jobTemplate = JobBuilder.Create<SendWeeklyReminderMailJob>()
.WithIdentity("job1", "group1")
.Build();
_ = theScheduler.ScheduleJob(jobTemplate,
Triggers,
false);
Перепланирование, потому что JobDataMap нуждается в обновлении:
var job = jobTemplate.GetJobBuilder().SetJobData(jobData).Build();
jobExecutionTrigger = jobExecutionTrigger.GetTriggerBuilder().Build();
theScheduler.Clear();
_ = theScheduler.ScheduleJob(job,
new List<ITrigger> {jobExecutionTrigger}.AsReadOnly(),
true);
Я реализовал небольшое ведение журнала, чтобы увидеть, что происходит:
2019-06-05 13:34:51,021 Result reminder: clearing previous scheduled job / rescheduling job..
2019-06-05 13:34:51,024 Result reminder: next reminder will be sent at 05.06.2019 13:35:00
2019-06-05 13:34:51,600 Result reminder: clearing previous scheduled job / rescheduling job..
2019-06-05 13:34:51,603 Result reminder: next reminder will be sent at 05.06.2019 13:35:00
Пока первый NextFireTime (13:35:00) не будет достигнут, все выглядит нормально для меня.
Затем первое выполнение моей работы происходит в 13: 35: 01:
2019-06-05 13:35:01,053 executing job...
2019-06-05 13:35:03,994 Result reminder: clearing previous scheduled job / rescheduling job..
2019-06-05 13:35:03,999 Result reminder: next reminder will be sent at 05.06.2019 13:35:00 <-- starting from here, NextFireTime is in the past
2019-06-05 13:35:04,009 executing job...
Задание выполняется без исключения, поэтому я ожидал, что каждое задание, запланированное после 13:35:00, сначала будет выполнено в 13:40:00 (CronTrigger с "0 * / 5 *? * * *")
Вместо этого я вижу, что NextFireTime уже в прошлом. Я предполагаю, что из-за этого каждое запланированное задание выполняется немедленно.