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

当使用 Spring 3.0功能对计划任务进行注释时,我希望将 fixedDelay设置为配置文件中的参数,而不是像当前那样将其硬连接到任务类中..。

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

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

113072 次浏览

我想您可以通过定义一个 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>

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

我还没有尝试过这些设置,但我希望它们能对你有所帮助。

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

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

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

Springv3.2.2在原来的3个长参数中添加了 String 参数来处理这个问题。fixedDelayStringfixedRateStringinitialDelayString现在也可用。

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

在 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

这就是 一篇文章,它详细解释了任务调度。