如何使用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参数来处理这个问题。 fixedDelayString
, fixedRateString
和initialDelayString
现在也可用。
@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>