NextFireTime CronTrigger не продвигается после первого срабатывания триггера - PullRequest
0 голосов
/ 05 июня 2019

(Отказ от ответственности: это уже размещено на 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 уже в прошлом. Я предполагаю, что из-за этого каждое запланированное задание выполняется немедленно.

...