代码之家  ›  专栏  ›  技术社区  ›  ngeek

如何用spring 3.0表达式语言参数化@scheduled(fixedelay)?

  •  106
  • ngeek  · 技术社区  · 15 年前

    当使用Spring3.0功能注释一个计划任务时,我想设置 fixedDelay 作为配置文件中的参数,而不是像当前一样硬连接到我的任务类中…

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

    不幸的是,使用spring表达式语言(spel)的方法 @Value 返回一个字符串对象,而该对象又不能根据 固定延迟 参数。

    4 回复  |  直到 8 年前
        1
  •  26
  •   Grzegorz Oledzki    15 年前

    我猜 @Scheduled 注释是不可能的。所以也许你可以用 task-scheduled XML配置。让我们考虑这个例子(从 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>
    

    再说一次,我没有试过这些设置,但我希望它能帮你一点忙。

        2
  •  372
  •   Mark-A    12 年前

    spring v3.2.2在原来的3个长参数中添加了字符串参数来处理这个问题。 fixedDelayString , fixedRateString initialDelayString 现在也有了。

    @Scheduled(fixedDelayString = "${my.fixed.delay.prop}")
    public void readLog() {
            ...
    }
    
        3
  •  49
  •   kan    14 年前

    你可以使用 @Scheduled 注释,但与 cron 仅限参数:

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

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

        4
  •  1
  •   Grzegorz Oledzki    15 年前

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