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

当使用Spring 3.0function来注释一个计划的任务,我想从我的configuration文件中设置fixedDelay作为参数,而不是硬连线到我的任务类,如目前…

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

不幸的是,用Springexpression式语言(SpEL) @Value的手段似乎返回一个String对象,而这个对象又不能像fixedDelay参数所要求的那样被自动装箱成一个long值。

我想@Scheduled注释是没有问题的。 所以也许你的解决scheme是使用task-scheduled XMLconfiguration。 让我们来考虑一下这个例子(复制自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已经为原来的3个长参数添加了String参数来处理这个问题。 fixedDelayStringfixedRateStringinitialDelayString现在也可用。

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

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

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

您的5秒间隔可以表示为"*/5 * * * * *" 。 但据我所知,你不能提供小于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>