Как параметризовать @Scheduled (fixedDelay) с языком выражений Spring 3.0? - PullRequest
110 голосов
/ 08 апреля 2010

При использовании возможности Spring 3.0 для аннотирования запланированной задачи я хотел бы установить fixedDelay в качестве параметра из моего файла конфигурации, вместо того, чтобы жестко связать его с моим классом задач, как в настоящее время ...

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

К сожалению, кажется, что с помощью Spring Expression Language (SpEL) @Value возвращает объект String, который, в свою очередь, не может быть автоматически упакован в длинное значение, как того требует параметр fixedDelay.

Ответы [ 4 ]

386 голосов
/ 09 мая 2013

Spring v3.2.2 добавил параметры String к исходным 3 длинным параметрам, чтобы справиться с этим. fixedDelayString, fixedRateString и initialDelayString теперь доступны также.

@Scheduled(fixedDelayString = "${my.fixed.delay.prop}")
public void readLog() {
        ...
}
49 голосов
/ 19 января 2012

Вы можете использовать аннотацию @Scheduled, но вместе с параметром cron:

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

Ваш 5-секундный интервал может быть выражен как "*/5 * * * * *". Однако, насколько я понимаю, вы не можете обеспечить точность менее 1 секунды.

26 голосов
/ 08 апреля 2010

Полагаю, аннотация @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>

Опять же, я не пробовал ни одну из этих настроек, но я надеюсь, что это может вам помочь.

1 голос
/ 08 апреля 2010

Полагаю, вы можете сами преобразовать значение, определив бин. Я не пробовал это , но я думаю, что подход, подобный следующему, может быть полезен для вас:

<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>
...