Удивительно, что до сих пор нет кварцевого метода для получения предыдущего времени обжига на основе CronExpression...
Как узнать время последнего увольнения?
Если вы манипулируете базовым CRON, например 0 0 0 * * ?
(в 00:00:00 каждый день), вы можете использовать решение João Neves (используя com.cronutils.model.time.ExecutionTime).
В противном случае, если вы манипулируете сложным CRON, например 0 30 11 ? * MON,THU *
, он не будет работать. Вы получите случайные результаты (у меня была среда для этого...).
Редактировать: я провел другие тесты, и они работают лучше с последней версией (предыдущие тесты проводились с версией ‹ 3.1.6). Примечание. Вам потребуется Java 8, если вы хотите использовать версию > 3.1.6.
Решение, которое вы можете использовать, состоит в том, чтобы сохранить его при запуске вашего задания.
Как убедиться, что задание запущено?
Решение, которое я нашел, состоит в том, чтобы использовать getNextValidTimeAfter
от Quartz (CronExpression). Этот работает нормально. Вы спросите меня, о чем я говорю, поскольку мы ищем предыдущее допустимое время! Вы правы, дайте мне одну секунду!
Давайте представим, что у нас есть CRON раз в месяц (0 0 16 1 * ? = В 16:00:00 1-го числа каждого месяца), и мы хотим каждый день проверять, что предыдущее выполнение сработало. Вам нужно будет сохранять getNextValidTime при каждом выполнении и сравнивать эту дату с сегодняшней датой. например (формат ДД/ММ/ГГГГ):
• 01.01.2019 → задание запущено, мы сохраняем время следующего срабатывания (назовем его nextFireTime
):
CronExpression trigger = new CronExpression("0 0 16 1 * ?");
Date nextFireTime = trigger.getNextValidTimeAfter(new Date());
// = 01/02/2019
• 01.02.2019 → проверка дня: 01.02.2019 ‹ 02.01.2019 ОК
...
• 02.01.2019 → допустим сервер не работает, задание не запускается.
• 02.02.2019 → сервер включен, проверка дня: 02.02.2019 > 02.01.2019 КО!
→ Мы знаем, что предыдущее время пожара не сработало. Вы можете делать то, что хотите (запустить задание и сохранить новое значение nextFireTime).
Другой вариант, который может вас заинтересовать, см. в разделе MISFIRE_INSTRUCTION_FIRE_NOW.
Задание выполняется сразу после того, как планировщик обнаружит ситуацию осечки. Это разумная политика. Пример сценария: вы запланировали очистку системы на 2 часа ночи. К сожалению, к тому времени приложение было отключено из-за технического обслуживания и вернулось в 3 часа ночи. Итак, триггер дал осечку, и планировщик пытается спасти ситуацию, запустив его как можно быстрее — в 3 часа ночи.
Из (https://dzone.com/articles/quartz-scheduler-misfire)
e.g.:
Trigger trigger = newTrigger().
withSchedule(
cronSchedule("0 0 9-17 ? * MON-FRI").
withMisfireHandlingInstructionFireAndProceed()
).
build();
Официальный документ: https://www.quartz-scheduler.org/api/2.1.7/org/quartz/CronTrigger.html
person
Emerica
schedule
03.10.2019