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


125

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

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

不幸的是,使用Spring Expression Language(SpEL)的方法似乎@Value返回了一个String对象,该对象又不能自动装箱为fixedDelay参数所要求的长值。

Answers:


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配置成功了。我对注释似乎是如此绑定到字符串值感到惊讶,无论如何,我还是
遵循

1
以上配置是否有Java等效项?
amique 2014年

@Grzegorz Oledzki <task:scheduled>标记下的“ someObject”的值是什么。如果控制器有多种方法需要固定延迟和初始延迟,那么该如何处理?
Mohit Singh's

422

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

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

3
@Avi这个答案来自OP的问题三年后。在提出问题(和接受的答案)时,此功能不存在。
medveshonok117

@ medveshonok117知道了。谢谢
Avi

51

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

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

您的5秒间隔可以表示为"*/5 * * * * *"。但是据我了解,您不能提供少于1秒的精度。


9
您显示的cron表达式等效于fixedRate,它与fixedDelay不同
代码盒

4

在Spring Boot 2中,我们可以将Spring Expression Language(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
}

application.properties文件将如下所示:

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

而已。这是一篇详细解释任务计划的文章


1

我想您可以通过定义一个bean来自己转换值。我还没有尝试过,但是我想类似于下面的方法可能对您有用:

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

2
不幸的是,这是行不通的,因为@Scheduled注释属性fixedDelay需要分配一个(长)常量。
ngeek 2010年

嗯是的 因此,我想您@Scheduled当时无法使用注释。
Grzegorz Oledzki'4
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.