Я пытаюсь получить задание cron, работающее в устаревшем проекте Java/ Spring/Hibernate, поэтому я решил использовать планировщик spring.
Я хочу, чтобы myTask.doStuff запускался в 12:00 в первое воскресенье каждого месяца.
В моем application-context.xml я настроил свой планировщик задач следующим образом:
<task:scheduled-tasks scheduler="MyTaskScheduler">
<task:scheduled ref="myTask" method="doStuff" cron="0 0 12 ? 1/1 SUN#1 *"/> <!-- Every first Sundy of the month -->
</task:scheduled-tasks>
<task:scheduler id="MyTaskScheduler" pool-size="10"/>
с самой проблемой cron-выражения: 0 0 12? 1/1 SUN # 1 *
и myTask
- это bean, который имеет метод под названием doStuff
, который отлично работает при запуске от модульных тестов.
Когда я создаю и развертываю, я получаю исключение при загрузке из spring:
Caused by: java.lang.IllegalArgumentException: cron expression must consist of 6 fields (found 7 in 0 0 12 ? 1/1 SUN#1 *)
at org.springframework.scheduling.support.CronSequenceGenerator.parse(CronSequenceGenerator.java:233)
at org.springframework.scheduling.support.CronSequenceGenerator.<init>(CronSequenceGenerator.java:81)
at org.springframework.scheduling.support.CronTrigger.<init>(CronTrigger.java:54)
at org.springframework.scheduling.support.CronTrigger.<init>(CronTrigger.java:44)
at org.springframework.scheduling.config.ScheduledTaskRegistrar.afterPropertiesSet(ScheduledTaskRegistrar.java:129)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1477)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1417)
Учитывая, что я впервые использую выражения cron, мое первое предположение состояло в том, что я делал что-то неправильно, но я дважды проверял использование cronmaker и это дало мне тот же результат.
Все документы говорят: выражение cron представляет собой строку, состоящую из шести или семи подвыражений (полей). 1
Несмотря на это, я попытался сбить 7-й элемент (год), так как он ни в одном из примеров, и получил другое сообщение об ошибке:
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.scheduling.config.ScheduledTaskRegistrar#0': Invocation of init method failed; nested exception is java.lang.NumberFormatException: For input string: "0#1"
... делает org.springframework.scheduling поддерживает другой вкус cron от всего остального? spring -специальная документация просто говорит 'cron expressions'.
Как я могу заставить это выражение cron работать как ожидалось в этом контексте? Любая помощь вообще будет оценена.
В настоящее время мое решение будет состоять в том, чтобы упростить это выражение, чтобы просто запускать каждое воскресенье, и добавить некоторую логику Java, чтобы рассчитать, какое воскресенье месяца оно есть, и посмотреть, работает ли это, но этот вид побеждает цель и похоже на антипаттерн.