Я впервые пытаюсь настроить Quartz, и простите, если я чего-то не понимаю. Мне интересно, как лучше всего добиться следующего:

Как настроить задание, которое должно запускать ежедневный отчет по электронной почте, а также иметь возможность восстанавливаться после пропущенного триггера, чтобы: 1) задание знало, в какой день ПРЕДНАЗНАЧЕН для срабатывания триггера. и 2) если (не дай бог) сервер не работает в течение 3 дней, Quartz восстановится, запустив три пропущенных дня подряд, также сообщая заданию, какой день представляет каждое задание. (порядок выполнения на самом деле не важен, если я знаю, какой день каждый представляет)

Прямо сейчас я просто делаю:

Trigger trigger = newTrigger() 
.withIdentity("dailyTrigger", "scheduledReportEmail") 
.startNow() 
.withSchedule(dailyAtHourAndMinute(0, 5) .withMisfireHandlingInstructionFireAndProceed()) 
.build(); 

Кажется, что это восстанавливается только после одного запуска, независимо от того, сколько дней пропущено. Это верно?

Один из подходов, о котором я подумал, - это установка 31 ежедневного триггера на дни 1-31. Неуклюжий .. а что может случиться в феврале за эти лишние дни? Это лучший подход?

У меня также есть еженедельные и ежемесячные триггеры, но я полагаю, что если мы упадем на три недели, у нас есть более важные вещи, о которых нужно беспокоиться :)

Спасибо за любой совет ....

4
Eric M 8 Янв 2013 в 23:50
2
Кто-то определенно должен описать этот случай в документации Quartz, потому что это один из наиболее распространенных вариантов использования!
 – 
Lu55
9 Авг 2018 в 13:07

1 ответ

Лучший ответ

Ваш вариант использования довольно стандартный и поддерживается Quartz. Вам просто нужна политика « игнорировать пропуски зажигания »:

Trigger trigger = newTrigger() 
  .withIdentity("dailyTrigger", "scheduledReportEmail") 
  .withSchedule(dailyAtHourAndMinute(0, 5)
  .withMisfireHandlingInstructionIgnoreMisfires()) 
  .build(); 

В основном это означает: меня не волнует, что триггер (ы) не сработал, просто запустите его как можно скорее (это, скорее всего, при запуске приложения).

Чтобы выяснить, когда предполагается запуск данного триггера (каково было запланированное время, а не текущее время), запустите это в своем задании:

void execute(JobExecutionContext context) {
  final Date scheduled = context.getScheduledFireTime()
  //...
}

Смотрите также

10
Community 23 Май 2017 в 15:16
3
Спасибо! Я действительно узнал об этом одновременно, но ваш ответ совершенно правильный! Название политики определенно сбило меня с толку, я не ожидал, что что-то под названием «игнорировать пропуски зажигания» выполнит все пропущенные триггеры. Однако с вашим объяснением название имеет смысл. Также getScheduledFireTime () - это именно то, что мне нужно!
 – 
Eric M
9 Янв 2013 в 01:17
@EricM: и я очень рад, что смог помочь!
 – 
Tomasz Nurkiewicz
9 Янв 2013 в 01:23
1
Привет, Томаш, я пытаюсь использовать withMisfireHandlingInstructionIgnoreMisfires () с JdbcJobStore с SimpleTrigger с 0 повторениями. Но здесь кварц не обрабатывает триггер по истечении запланированного времени. Это означает, что обработка сработавшего триггера просто игнорируется. В чем может быть причина здесь? Та же программа хорошо работает с RamJobStore с той же инструкцией о пропуске зажигания. С RamjobStore задание выполняется в соответствии с вашим объяснением выше (т.е. как можно скорее).
 – 
CourseTriangle
29 Май 2013 в 13:33