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

Spring 3.0 기능을 사용하여 예약 된 작업에 주석을 달 때 fixedDelay현재와 ​​같이 내 작업 클래스에 하드 배선하는 대신 구성 파일에서 as 매개 변수 를 설정하고 싶습니다 …

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

불행히도 Spring Expression Language (SpEL)를 사용 @Value하면 String 객체를 반환하여 fixedDelay매개 변수에 필요한 긴 값으로 자동 상자를 만들 수없는 것으로 보입니다 .



답변

@Scheduled주석에 문제가 있다고 생각합니다 . 따라서 task-scheduledXML 구성 을 사용하는 것이 좋습니다 . 이 예제를 고려해 봅시다 ( 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>

다시 한번, 나는 이러한 설정을 시도하지 않았지만 약간 도움이되기를 바랍니다.


답변

Spring v3.2.2는이를 처리하기 위해 String 매개 변수를 원래 3 개의 long 매개 변수에 추가했습니다. fixedDelayString, fixedRateStringinitialDelayString도 사용할 수 있습니다.

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


답변

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

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

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


답변

Spring Boot 2에서는 @Scheduled주석 속성에 Spring Expression Language (SpPL)를 사용할 수 있습니다 .

@Scheduled(fixedRateString = "${fixed-rate.in.milliseconds}")
public void fixedRate() {
    // do something here
}

@Scheduled(fixedDelayString = "${fixed-delay.in.milliseconds}")
public void fixedDelay() {
    // do something here
}

@Scheduled(cron = "${cron.expression}")
public void cronExpression() {
    // do something here
}

application.properties파일은 다음과 같이 표시됩니다

fixed-rate.in.milliseconds=5000
fixed-delay.in.milliseconds=4000
cron.expression=0 15 5 * * FRI

그게 다야. 다음은 작업 예약에 대해 자세히 설명 하는 기사 입니다.


답변

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

<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>


답변