Як параметризувати @Scheduled (fixDelay) з мовою вираження Spring 3.0?


126

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

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

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

Відповіді:


26

Я думаю, що @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>

Знову ж таки, я не пробував жодної з цих налаштувань, але сподіваюся, що це може вам трохи допомогти.


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

1
Чи є еквівалент Java для конфігурації вище?
amique

@Grzegorz Oledzki, яким буде значення "someObject" під тегом <task: raspored>. Якщо у контролера є більше одного методу, який потребує фіксованої затримки та початкової затримки, то як це буде оброблятися?
Мохіт Сінгх

423

Spring v3.2.2 додав параметри String до початкових 3 довгих параметрів, щоб впоратися з цим. fixedDelayString, fixedRateStringі initialDelayStringзараз вони також доступні.

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

3
@Avi Ця відповідь приходить через три роки після питання ОП. На момент запитання (та прийнятої відповіді) ця функція не існувала.
medveshonok117

@ medveshonok117 Зрозумів. Спасибі
Аві

51

Ви можете використовувати @Scheduledпримітку, але разом із cronпараметром лише:

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

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


9
Вираз хрон , що ви показали , що еквівалентно fixedRate, яка відрізняється від fixedDelay
CodeBox

4

У Spring Boot 2 ми можемо використовувати Spring Expression Language (SpPL) для @Scheduledвластивостей анотацій:

@Scheduled(fixedRateString = "${fixed-rate.in.milliseconds}")
public void fixedRate() {
    // do something here
}

@Scheduled(fixedDelayString = "${fixed-delay.in.milliseconds}")
public void fixedDelay() {
    // do something here
}

@Scheduled(cron = "${cron.expression}")
public void cronExpression() {
    // do something here
}

application.propertiesФайл буде виглядати наступним чином :

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

Це воно. Ось стаття, яка детально пояснює планування завдань.


1

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

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

Дякую, це звучить як один спосіб, але якщо чесно, я сподівався на більш елегантне ("весняне") рішення :-)
ngeek

2
На жаль, це не вийде, оскільки атрибут @Scheduled annotation fixDelay потребує призначення (тривалої) константи.
ngeek

Ага, саме так. Тож я гадаю, що ви не зможете зробити це з @Scheduledанотацією.
Grzegorz Oledzki
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.