How to parameterize @Scheduled(fixedDelay) with Spring 3.0 expression language?
Solution 1
I guess the @Scheduled
annotation is out of question. So maybe a solution for you would be to use task-scheduled
XML configuration. Let's consider this example (copied from Spring doc):
<task:scheduled-tasks scheduler="myScheduler">
<task:scheduled ref="someObject" method="readLog"
fixed-rate="#{YourConfigurationBean.stringValue}"/>
</task:scheduled-tasks>
... or if the cast from String to Long didn't work, something like this would:
<task:scheduled-tasks scheduler="myScheduler">
<task:scheduled ref="someObject" method="readLog"
fixed-rate="#{T(java.lang.Long).valueOf(YourConfigurationBean.stringValue)}"/>
</task:scheduled-tasks>
Again, I haven't tried any of these setups, but I hope it might help you a bit.
Solution 2
Spring v3.2.2 has added String parameters to the original 3 long parameters to handle this. fixedDelayString
, fixedRateString
and initialDelayString
are now available too.
@Scheduled(fixedDelayString = "${my.fixed.delay.prop}")
public void readLog() {
...
}
Solution 3
You can use the @Scheduled
annotation, but together with the cron
parameter only:
@Scheduled(cron = "${yourConfiguration.cronExpression}")
Your 5 seconds interval could be expressed as "*/5 * * * * *"
. However as I understand you cannot provide less than 1 second precision.
Solution 4
In Spring Boot 2, we can use Spring Expression Language (SpPL) for @Scheduled
annotation properties:
@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
}
The application.properties
file will look like this:
fixed-rate.in.milliseconds=5000
fixed-delay.in.milliseconds=4000
cron.expression=0 15 5 * * FRI
That's it. Here is an article that explains task scheduling in detail.
Solution 5
I guess you can convert the value yourself by defining a bean. I haven't tried that, but I guess the approach similar to the following might be useful for you:
<bean id="FixedDelayLongValue" class="java.lang.Long"
factory-method="valueOf">
<constructor-arg value="#{YourConfigurationBean.stringValue}"/>
</bean>
where:
<bean id="YourConfigurationBean" class="...">
<property name="stringValue" value="5000"/>
</bean>
ngeek
Software Developer with focus on Java and the JVM, lately getting more and more hooked on Clojure.
Updated on August 21, 2020Comments
-
ngeek over 3 years
When using the Spring 3.0 capability to annotate a scheduled task, I would like to set the
fixedDelay
as parameter from my configuration file, instead of hard-wiring it into my task class, like currently...@Scheduled(fixedDelay = 5000) public void readLog() { ... }
Unfortunately it seems that with the means of the Spring Expression Language (SpEL)
@Value
returns a String object which in turn is not able to be auto-boxed to a long value as required by thefixedDelay
parameter. -
ngeek about 14 yearsThanks, that sounds like one way, but to be honest I was hoping for a more elegant ("springish") solution :-)
-
ngeek about 14 yearsUnfortunately this will not work, since the @Scheduled annotation attribute fixedDelay requires a (long) constant to be assigned.
-
Grzegorz Oledzki about 14 yearsAh, that's right. So I guess you can't do it with the
@Scheduled
annotation then. -
ngeek about 14 yearsThanks, the XML configuration did the trick. I am bit surprised that the annotation seems so bound to string values, anyways, I go with the old-school way ;-)
-
codebox about 11 yearsThe cron expression that you have shown is equivalent to fixedRate, which is different to fixedDelay
-
amique about 10 yearsIs there any Java equivalent for above config?
-
Mohit Singh over 7 years@Grzegorz Oledzki what will be the value of "someObject" under <task:scheduled > tag. If a controller have more than one method that needs fixed delay and initial delay then how will that be handled?
-
m c over 6 years@Avi This answer comes three years after the OP's question. At the time of the question (and accepted answer) this feature didn't exist.
-
Avi over 6 years@medveshonok117 Got it. Thanks
-
eis over 3 years@medveshonok117 and? it is still the most correct answer now.