Spring 3.0 기능을 사용하여 예약 된 작업에 주석을 달 때 fixedDelay
현재와 같이 내 작업 클래스에 하드 배선하는 대신 구성 파일에서 as 매개 변수 를 설정하고 싶습니다 …
@Scheduled(fixedDelay = 5000)
public void readLog() {
...
}
불행히도 Spring Expression Language (SpEL)를 사용 @Value
하면 String 객체를 반환하여 fixedDelay
매개 변수에 필요한 긴 값으로 자동 상자를 만들 수없는 것으로 보입니다 .
답변
@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>
다시 한번, 나는 이러한 설정을 시도하지 않았지만 약간 도움이되기를 바랍니다.
답변
Spring v3.2.2는이를 처리하기 위해 String 매개 변수를 원래 3 개의 long 매개 변수에 추가했습니다. fixedDelayString
, fixedRateString
및 initialDelayString
도 사용할 수 있습니다.
@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>