TL; DR
У Quartz 1 ви можете використовувати цей cron: 59 59 23 31 12 ? 2099
(остання дата дії).
У Quartz 2 ви можете використовувати цей cron:0 0 0 1 1 ? 2200
Використання виразу далеко в майбутньому
Зробив кілька швидких тестів, використовуючи org.quartz.CronExpression
.
String exp = "0 0 0 1 1 ? 3000";
boolean valid = CronExpression.isValidExpression(exp);
System.out.println(valid);
if (valid) {
CronExpression cronExpression = new CronExpression(exp);
System.out.println(cronExpression.getNextValidTimeAfter(new Date()));
}
Коли я це роблю String exp = "# 0 0 0 1 1 ?";
, isValid
тест повертається false
.
Зі зразком, наведеним вище, результат виходить наступним:
true
null
Значення:
- вираз дійсний;
- немає майбутньої дати, яка відповідає цьому виразу.
Однак для того, щоб планувальник прийняв тригер cron, останній повинен відповідати даті в майбутньому.
Я спробував кілька років і зрозумів, що коли рік перевищує 2300, кварц, здається, вже не турбує (хоча я не знайшов згадки про максимальне значення року в документації на кварц 2 ). Це може бути більш чистий спосіб, але це задовольнить мої потреби на даний момент.
Отже, зрештою, я пропоную крон 0 0 0 1 1 ? 2200
.
Кварцовий варіант 1
Зверніть увагу, що в кварці 1 2099 рік є останнім чинним роком . Тому ви можете адаптувати свій вираз cron, щоб використовувати пропозицію Мацей Матіс :59 59 23 31 12 ? 2099
Альтернатива: використання дати в минулому
Арно Денойель запропонував щось більш елегантне, що мій наведений вище тест підтверджує як правильний вираз: замість того, щоб обирати дату в далекому майбутньому, вибирайте її в далекому минулому:
0 0 0 1 1 ? 1970
(перший дійсний вираз згідно з кварцовою документацією).
Однак це рішення не працює.
hippofluff підкреслив, що кварц виявить вираз у минулому, більше ніколи не буде виконаний, і тому видасть виняток.
org.quartz.SchedulerException: Based on configured schedule, the given trigger will never fire.
Здається, це було в Кварці вже давно .
Вивчені уроки: тест не є надійним, як є
Це підкреслює слабкість мого тесту: якщо ви хочете протестувати a CronExpression
, пам’ятайте, що він повинен мати nextValidTime
1 . В іншому випадку планувальник, якому ви його передасте, просто відхилить його, згаданий вище виняток.
Я порадив би адаптувати тестовий код наступним чином:
String exp = "0 0 0 1 1 ? 3000";
boolean valid = CronExpression.isValidExpression(exp);
if (valid) {
CronExpression cronExpression = new CronExpression(exp);
valid = cronExpression.getNextValidTimeAfter(new Date()) != null;
}
System.out.println("Can I use <" + exp + ">? " + (valid ? "Go ahead!" : "This shall fail."));
Ось: не потрібно думати, просто прочитайте результати.
1 Це та частина, про яку я забув, перевіряючи рішення Арно, роблячи мене дурнем і доводячи, що мій тест не підтверджував мене.
#
символом коментаря.