Подтвердить что ты не робот

Spring cron vs normal cron?

Я пытаюсь получить задание 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, чтобы рассчитать, какое воскресенье месяца оно есть, и посмотреть, работает ли это, но этот вид побеждает цель и похоже на антипаттерн.

4b9b3361

Ответ 1

Spring Запланированные задачи не в том же формате, что и выражения cron.

Они не соответствуют тому же формату, что и выражения cron UNIX.

Есть только 6 полей: секунда, минута, час, день месяца, месяц, день недели. Asterisk (*) означает соответствие любому. */X означает "каждый X" (см. Примеры). Числовые дни недели не работают для меня. Кроме того, "MON-FRI" гораздо легче читать. Вот несколько примеров выражений:

"0 0 18 * * MON-FRI" означает каждый будний день в 18:00.

"0 0 */1 * * *" означает каждый час в часе.

"0 0 */8 * * *" означает каждые 8 ​​часов в час.

"0 0 12 1 * *" означает 12:00 PM в первый день каждого месяца.

Здесь вы можете найти дополнительную информацию: http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/scheduling/support/CronSequenceGenerator.html

Также вы можете найти полезную документацию spring: http://docs.spring.io/spring-framework/docs/current/spring-framework-reference/html/scheduling.html