如何用Spring 3.0表达式语言参数化@Scheduled(fixedDelay)?

nge*_*eek 116 java configuration spring annotations scheduling

当使用Spring 3.0功能来注释计划任务时,我想fixedDelay从配置文件中设置as参数,而不是将其硬连接到我的任务类中,就像当前...

@Scheduled(fixedDelay = 5000)
public void readLog() {
        ...
}
Run Code Online (Sandbox Code Playgroud)

不幸的是,使用Spring表达式语言(SpEL)的方法似乎@Value返回一个String对象,而该对象又无法按fixedDelay参数的要求自动装入长值.

小智 403

Spring v3.2.2已将String参数添加到原始的3个long参数中以处理此问题.fixedDelayString,fixedRateStringinitialDelayString现在可以了.

@Scheduled(fixedDelayString = "${my.fixed.delay.prop}")
public void readLog() {
        ...
}
Run Code Online (Sandbox Code Playgroud)

  • 为什么这不是正确的答案? (6认同)
  • @medveshonok117 和?现在仍然是最正确的答案。 (4认同)
  • @Avi这个答案是在OP的问题发生三年之后.在问题(和接受的答案)时,此功能不存在. (3认同)

kan*_*kan 50

您可以使用@Scheduled注释,但cron仅与参数一起使用:

@Scheduled(cron = "${yourConfiguration.cronExpression}")
Run Code Online (Sandbox Code Playgroud)

你的5秒间隔可以表示为"*/5 * * * * *".但据我了解,你不能提供不到1秒的精度.

  • 您显示的cron表达式等同于fixedRate,它与fixedDelay不同 (8认同)

Grz*_*zki 26

我想这个@Scheduled注释是不可能的.所以也许你的解决方案是使用task-scheduledXML配置.让我们考虑这个例子(从Spring doc复制):

<task:scheduled-tasks scheduler="myScheduler">
    <task:scheduled ref="someObject" method="readLog" 
               fixed-rate="#{YourConfigurationBean.stringValue}"/>
</task:scheduled-tasks>
Run Code Online (Sandbox Code Playgroud)

...或者如果从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>
Run Code Online (Sandbox Code Playgroud)

同样,我还没有尝试过任何这些设置,但我希望它可能对你有所帮助.


att*_*ian 10

在 Spring Boot 2 中,我们可以使用 Spring 表达式语言 (SpPL) 来@Scheduled注释属性:

@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
}
Run Code Online (Sandbox Code Playgroud)

application.properties文件将如下所示:

fixed-rate.in.milliseconds=5000
fixed-delay.in.milliseconds=4000
cron.expression=0 15 5 * * FRI
Run Code Online (Sandbox Code Playgroud)

就是这样。这里有一篇文章详细解释了任务调度。