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


125

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

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

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

답변:


26

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

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


감사합니다. XML 구성으로 트릭을 수행했습니다. 어노테이션이 문자열 값에 너무 바인딩되어있는 것처럼 보입니다. 어쨌든, 나는 구식 방법을 사용합니다. ;-)
ngeek

1
위의 구성에 해당하는 Java가 있습니까?
amique

@Grzegorz Oledzki <task : scheduled> 태그 아래의 "someObject"값은 무엇입니까? 컨트롤러에 고정 지연과 초기 지연이 필요한 둘 이상의 방법이있는 경우 어떻게 처리합니까?
Mohit Singh

422

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

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

3
@Avi이 답변은 OP 질문 후 3 년이되었습니다. 질문 (및 수락 된 답변) 당시에는이 기능이 존재하지 않았습니다.
medveshonok117

@ medveshonok117 알았어. 감사합니다
Avi

51

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

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

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


9
당신이 보여 있다는 크론 표현은 fixedDelay에 다른 있도록, fixedRate, 동일합니다
codebox

4

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

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


1

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

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

고마워, 그것은 한 가지 방법처럼 들리지만, 솔직히 말하면 나는 더 우아한 ( "봄 같은") 해결책을 기대하고 있었다 :-)
ngeek

2
@Scheduled 주석 속성 fixedDelay에 (긴) 상수를 할당해야하기 때문에 불행히도 이것은 작동하지 않습니다.
ngeek

아 맞습니다. 그래서 당신은 @Scheduled주석으로 그것을 할 수 없다고 생각합니다 .
Grzegorz Oledzki
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.