TL; DR
Quartz 1에서는 다음 cron : 59 59 23 31 12 ? 2099
(마지막 유효 날짜)를 사용할 수 있습니다 .
Quartz 2에서는 다음 크론을 사용할 수 있습니다.0 0 0 1 1 ? 2200
먼 미래의 표현 사용
.NET을 사용하여 몇 가지 빠른 테스트를 수행했습니다 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을 넘으면 Quartz가 더 이상 귀찮게 보이지 않는다는 것을 알아 냈습니다 ( Quartz 2의 문서에서 올해 최대 값에 대한 언급을 찾지 못했지만 ). 이 작업을 수행하는 더 깨끗한 방법이있을 수 있지만 지금은 내 요구를 충족시킬 것입니다.
그래서 결국 내가 제안하는 cron은 0 0 0 1 1 ? 2200
.
Quartz 1 변형
Quartz 1에서 2099 년은 마지막 유효 연도 입니다. 따라서 Maciej Matys의 제안 을 사용하도록 cron 표현식을 조정할 수 있습니다 .59 59 23 31 12 ? 2099
대안 : 과거 날짜 사용
Arnaud Denoyelle 은 더 우아한 것을 제안했는데, 위의 테스트에서 올바른 표현으로 검증했습니다. 먼 미래의 날짜를 선택하는 대신 먼 과거의 날짜를 선택하십시오.
0 0 0 1 1 ? 1970
(Quartz 문서에 따른 첫 번째 유효한 표현식).
이 솔루션은 작동하지 않습니다.
hippofluff 는 Quartz가 과거에 표현식을 감지 할 것이므로 다시는 실행되지 않으므로 예외가 발생 한다고 강조했습니다.
org.quartz.SchedulerException: Based on configured schedule, the given trigger will never fire.
이것은 오랫동안 Quartz 에 있었던 것 같다 .
배운 교훈 : 테스트는 그대로 완벽하지 않습니다.
이것은 내 테스트의 약점을 강조합니다. a를 테스트 하려면 1 이 있어야한다는CronExpression
것을 기억 하십시오nextValidTime
. 그렇지 않으면 전달할 스케줄러가 위에서 언급 한 예외와 함께이를 거부합니다.
다음과 같이 테스트 코드를 수정하는 것이 좋습니다.
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 이것은 Arnaud의 솔루션을 테스트하면서 나를 바보로 만들고 내 테스트가 내 테스트가 아니라는 것을 증명할 때 잊은 부분입니다.
#
주석 문자로 명령을 시작하는 것 입니다.