복붙노트

[SPRING] 봄 크론 대 보통 크론?

SPRING

봄 크론 대 보통 크론?

레거시 Java / Spring / Hibernate 프로젝트 내에서 cron 작업을 수행하려고 노력 중이므로 스프링 스케줄러를 사용하기로 결정했습니다.

매월 첫째 일요일 12시에 myTask.doStuff를 실행하고 싶습니다.

내 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는 단위 테스트에서 실행할 때 완벽하게 작동하는 doStuff라는 메소드가있는 bean입니다.

빌드하고 배포 할 때 봄부터 부트 타임 예외가 발생합니다.

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 표현식은 6 개 또는 7 개의 서브 표현식 (필드)으로 구성된 문자열입니다.

이것에도 불구하고 나는 7 번째 엘리먼트 (year)를 노크 해보기를 시도했다. 왜냐하면 어떤 예제에도 없기 때문에 다른 에러 메시지가 나온다 :

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의 다른 맛을 지원합니까? 스프링 관련 문서는 'cron 표현식'이라고 말합니다.

이 문맥에서이 cron 표현식이 예상대로 작동하도록하려면 어떻게해야합니까? 어떤 도움이라도 인정 될 것입니다.

현재로서는이 표현을 매주 일요일에 실행하기 위해이 표현을 단순화하고 Java 논리를 앞에두고 일요일을 계산하여 그 작동 여부를 확인하는 것이지만 구성 접근법의 목적을 반 패턴처럼 보인다.

해결법

  1. ==============================

    1.Spring Scheduled tasks는 cron 표현식과 같은 형식이 아닙니다.

    Spring Scheduled tasks는 cron 표현식과 같은 형식이 아닙니다.

    이들은 UNIX cron 표현식과 동일한 형식을 따르지 않습니다.

    초, 분,시, 일, 달, 달, 요일 (일)의 6 개의 필드 만 있습니다. 별표 (*)는 모두를 의미합니다. * / X는 "모든 X"를 의미합니다 (예제 참조). 숫자주의 요일은 나를 위해 작동하지 않습니다. 게다가, "월 - 금"은 읽기가 훨씬 쉽습니다. 다음은 몇 가지 예제 표현식입니다.

    "0 0 18 * * MON-FRI"는 매일 평일 오후 6시에 있음을 의미합니다.

    "0 0 * / 1 * * *"은 매시간을 의미합니다.

    "0 0 * / 8 * * *"은 매시간 8 시간을 의미합니다.

    "0 0 12 1 * *"는 매월 1 일 오후 12시를 의미합니다.

    여기에 몇 가지 추가 정보가 있습니다. http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/scheduling/support/CronSequenceGenerator.html

    또한 스프링 문서가 유용 할 수도 있습니다. https://docs.spring.io/spring-framework/docs/current/spring-framework-reference/integration.html#scheduling

  2. from https://stackoverflow.com/questions/30887822/spring-cron-vs-normal-cron by cc-by-sa and MIT license