2010-04-08 5 views
93

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

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

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

ответ

26

Я думаю @Scheduled аннотацию находится вне вопроса. Поэтому, возможно, для вас было бы целесообразно использовать конфигурацию XML task-scheduled. Давайте рассмотрим следующий пример (скопированный из Spring doc):

<task:scheduled-tasks scheduler="myScheduler"> 
    <task:scheduled ref="someObject" method="readLog" 
       fixed-rate="#{YourConfigurationBean.stringValue}"/> 
</task:scheduled-tasks> 

... или если отлитые из строки в Лонг не работает, что-то, как это было:

<task:scheduled-tasks scheduler="myScheduler"> 
    <task:scheduled ref="someObject" method="readLog" 
      fixed-rate="#{T(java.lang.Long).valueOf(YourConfigurationBean.stringValue)}"/> 
</task:scheduled-tasks> 

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

+0

Спасибо, конфигурация XML сделала трюк. Я немного удивлен тем, что аннотация кажется настолько привязанной к строковым значениям, так или иначе, я иду со способом старой школы ;-) – ngeek

+1

Есть ли какой-либо эквивалент Java для вышеуказанной конфигурации? – amique

+0

@Grzegorz Oledzki, что будет значением «someObject» в теге . Если у контроллера есть несколько методов, требующих фиксированной задержки и начальной задержки, то как это будет обрабатываться? – Moitt

0

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

<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> 
+0

Спасибо, что звучит, как один из способов, но, честно говоря, я надеялся на более элегантное решение («springish») :-) – ngeek

+1

К сожалению, это не будет работать, так как @Scheduled аннотации атрибут fixedDelay требует (длинной) константы. – ngeek

+0

А, это верно. Поэтому я думаю, вы не можете сделать это с помощью аннотации '@ Scheduled'. –

43

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

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

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

+7

Выражение cron, которое вы показали, эквивалентно fixedRate, которое отличается от fixedDelay – codebox

305

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

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

Почему это не отмечено как правильный ответ? – Avi

+0

@Avi Этот ответ приходит через три года после вопроса OP. Во время вопроса (и принятого ответа) эта функция не существовала. – medveshonok117

+0

@ medveshonok117 Получил это. благодаря – Avi

Смежные вопросы