Я тоже столкнулся с проблемой желания запустить последнее запланированное задание при перезапуске сервера.
Это решение, которое я нашел, состоит в том, чтобы вернуться назад на один временной интервал для триггера и вычислить, что было бы следующим временем срабатывания. Итерируя по всем триггерам, можно определить самое последнее время, когда триггер должен был срабатывать в прошлом.
Рассчитайте интервал между каждой стрельбой:
Date nextFireTime = trigger.getNextFireTime();
Date subsequentFireTime = trigger.getFireTimeAfter(nextFireTime);
long interval = subsequentFireTime.getTime() - nextFireTime.getTime();
Найти время следующего обжига за один раз до интервала в прошлом:
Date previousPeriodTime = new Date(System.currentTimeMillis() - interval);
Date previousFireTime = trigger.getFireTimeAfter(previousPeriodTime);
Я обнаружил, что если вы используете CronTrigger
, это не позволяет вам задавать вопрос о времени пожара в прошлом. Чтобы обойти это, я изменяю время запуска, поэтому приведенный выше фрагмент кода становится следующим:
Date originalStartTime = trigger.getStartTime(); // save the start time
Date previousPeriodTime = new Date(originalStartTime.getTime() - interval);
trigger.setStartTime(previousPeriodTime);
Date previousFireTime = trigger.getFireTimeAfter(previousPeriodTime);
trigger.setStartTime(originalStartTime); // reset the start time to be nice
Переберите все триггеры и найдите тот, который последний раз был в прошлом:
for (String groupName : scheduler.getTriggerGroupNames()) {
for (String triggerName : scheduler.getTriggerNames(groupName)) {
Trigger trigger = scheduler.getTrigger(triggerName, groupName);
// code as detailed above...
interval = ...
previousFireTime = ...
}
}
Я оставлю читателю в качестве упражнения рефакторинг этого в вспомогательные методы или классы. Я фактически использую вышеупомянутый алгоритм в триггере делегирования подкласса, который затем помещаю в набор, отсортированный по предыдущему времени срабатывания.