복붙노트

[SPRING] @Scheduled (fixedDelay)를 Spring 3.0 표현 언어로 매개 변수화하는 방법은 무엇입니까?

SPRING

@Scheduled (fixedDelay)를 Spring 3.0 표현 언어로 매개 변수화하는 방법은 무엇입니까?

예약 된 작업에 주석을 달기 위해 Spring 3.0 기능을 사용하는 경우, 현재의 것처럼 내 작업 클래스에 하드 와이어로 연결하는 대신 fixedDelay를 구성 파일의 매개 변수로 설정하고 싶습니다 ...

@Scheduled(fixedDelay = 5000)
public void readLog() {
        ...
}

불행하게도 스프링 표현 언어 (SpEL)의 수단을 사용하면 @Value가 String 객체를 반환하고 차례로 fixedDelay 매개 변수에서 요구하는대로 긴 값으로 자동 박스 될 수없는 것으로 보입니다.

해결법

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

    1.@Scheduled 주석은 의문의 여지가 있습니다. 그래서 당신을위한 해결책은 task-scheduled XML 설정을 사용하는 것입니다. 이 예제를 살펴 보자 (Spring doc에서 복사) :

    @Scheduled 주석은 의문의 여지가 있습니다. 그래서 당신을위한 해결책은 task-scheduled XML 설정을 사용하는 것입니다. 이 예제를 살펴 보자 (Spring doc에서 복사) :

    <task:scheduled-tasks scheduler="myScheduler">
        <task:scheduled ref="someObject" method="readLog" 
                   fixed-rate="#{YourConfigurationBean.stringValue}"/>
    </task:scheduled-tasks>
    

    ... 또는 String에서 Long으로 캐스트가 작동하지 않으면 다음과 같이됩니다.

    <task:scheduled-tasks scheduler="myScheduler">
        <task:scheduled ref="someObject" method="readLog"
                fixed-rate="#{T(java.lang.Long).valueOf(YourConfigurationBean.stringValue)}"/>
    </task:scheduled-tasks>
    

    다시 말하지만, 이러한 설정을 시도하지는 않았지만 조금 도움이 되었기를 바랍니다.

  2. ==============================

    2.Spring v3.2.2는 이것을 처리하기 위해 String 매개 변수를 원래의 3 개의 긴 매개 변수에 추가했습니다. fixedDelayString, fixedRateString 및 initialDelayString을 사용할 수 있습니다.

    Spring v3.2.2는 이것을 처리하기 위해 String 매개 변수를 원래의 3 개의 긴 매개 변수에 추가했습니다. fixedDelayString, fixedRateString 및 initialDelayString을 사용할 수 있습니다.

    @Scheduled(fixedDelayString = "${my.fixed.delay.prop}")
    public void readLog() {
            ...
    }
    
  3. ==============================

    3.@Scheduled 주석을 사용할 수 있지만 cron 매개 변수와 함께 사용하면됩니다.

    @Scheduled 주석을 사용할 수 있지만 cron 매개 변수와 함께 사용하면됩니다.

    @Scheduled(cron = "${yourConfiguration.cronExpression}")
    

    5 초 간격은 "* / 5 * * * * *"로 표현할 수 있습니다. 그러나 1 초 미만의 정확도를 제공 할 수는 없습니다.

  4. ==============================

    4.콩을 정의하여 값을 직접 변환 할 수 있다고 생각합니다. 나는 그것을 시도하지 않았지만 다음과 비슷한 접근법이 유용 할 것이라고 생각한다.

    콩을 정의하여 값을 직접 변환 할 수 있다고 생각합니다. 나는 그것을 시도하지 않았지만 다음과 비슷한 접근법이 유용 할 것이라고 생각한다.

    <bean id="FixedDelayLongValue" class="java.lang.Long"
          factory-method="valueOf">
        <constructor-arg value="#{YourConfigurationBean.stringValue}"/>
    </bean>
    

    어디에:

    <bean id="YourConfigurationBean" class="...">
             <property name="stringValue" value="5000"/>
    </bean>
    
  5. from https://stackoverflow.com/questions/2598712/how-to-parameterize-scheduledfixeddelay-with-spring-3-0-expression-language by cc-by-sa and MIT license