Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/380.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何用Spring3.0表达式语言参数化@Scheduled(fixedDelay)?_Java_Spring_Configuration_Annotations_Scheduling - Fatal编程技术网

Java 如何用Spring3.0表达式语言参数化@Scheduled(fixedDelay)?

Java 如何用Spring3.0表达式语言参数化@Scheduled(fixedDelay)?,java,spring,configuration,annotations,scheduling,Java,Spring,Configuration,Annotations,Scheduling,当使用Spring 3.0功能注释计划任务时,我希望将fixedDelay设置为配置文件中的参数,而不是将其硬连接到我的任务类中,如当前 @Scheduled(fixedDelay = 5000) public void readLog() { ... } 不幸的是,似乎通过Spring表达式语言(SpEL)@Value返回一个字符串对象,而该字符串对象又无法按照fixeddedelay参数的要求自动装箱为长值。我想您可以通过定义一个bean来转换该值。我没有尝试过,但我想类似

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

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

不幸的是,似乎通过Spring表达式语言(SpEL)
@Value
返回一个字符串对象,而该字符串对象又无法按照
fixeddedelay
参数的要求自动装箱为长值。

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

我想
@预定的
注释是不可能的。因此,您的解决方案可能是使用
task scheduled
XML配置。让我们考虑这个例子(复制):


。。。或者如果从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秒的精度。

Spring v3.2.2在原来的3个长参数中添加了字符串参数来处理此问题
fixedDelayString
fixedRateString
initialDelayString
现在也可以使用

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

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

@Scheduled(fixedRateString=“${fixed rate.in.毫秒])
公共void fixedRate(){
//在这里做点什么
}
@已计划(fixedDelayString=“${fixed delay.in.millists}”)
公共无效固定延迟(){
//在这里做点什么
}
@已计划(cron=“${cron.expression}”)
公共表达式(){
//在这里做点什么
}
application.properties
文件如下所示:

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

就这样。下面是任务调度的详细说明。

谢谢,这听起来像是一种方法,但老实说,我希望有一个更优雅(“弹性”)的解决方案:-)不幸的是,这不起作用,因为@Scheduled annotation属性fixedDelay需要分配一个(长)常量。啊,没错。所以我猜你不能用
@Scheduled
注释来完成。谢谢,XML配置成功了。我有点惊讶,注释似乎如此绑定到字符串值,不管怎么说,我还是按照老派的方式;-)上述配置是否有Java等价物?@Grzegorz Oledzki标记下“someObject”的值是多少。如果一个控制器有多个需要固定延迟和初始延迟的方法,那么将如何处理?您所展示的cron表达式相当于fixedRate,这与fixedDelay@Avi这个答案是在OP提出问题三年后得出的。在提出问题(并接受答案)时,此功能不存在。@medveshonok117获得它。Thanks@medveshonok117然后呢?现在这仍然是最正确的答案。
fixed-rate.in.milliseconds=5000
fixed-delay.in.milliseconds=4000
cron.expression=0 15 5 * * FRI