2015-10-05 6 views
3

Я изучаю с использованием @Scheduled по фиксированной ставке, где в некотором настраивается обстоятельствах, запланированное задание никогда не должно запускаться.Можно ли назначить @Scheduled периодом, представляющим «никогда» (весной)?

документация не упоминает это, но значения по умолчанию для fixedDelay() и fixedDelayString() являются -1 и "" соответственно. Могут ли они использоваться для надежного обеспечения того, чтобы плановый метод не срабатывал?

ответ

3

Вы не можете. Когда вы установите атрибут -1 или попытку использование @ScheduledfixedDelay без указания действительного значения для любого из его атрибутов, Spring будет жаловаться, что нет атрибута не установлен:

Ровно один из 'cron', 'fixedDelay(String)' или 'fixedRate(String)' атрибутов required

Вы можете это проверить, пройдя исходный код ScheduledAnnotationBeanPostProcessor#processScheduled.

Он содержит логику как:

boolean processScheduled = false; 

// ... 

if (fixedRate >= 0) { 
    Assert.isTrue(!processedSchedule, errorMessage); 
    processedSchedule = true; 
    this.registrar.addFixedRateTask(new IntervalTask(runnable, fixedRate, initialDelay)); 
} 

// ... 

Assert.isTrue(processedSchedule, errorMessage); 

Взгляните на эту SO post для некоторых вариантов условно отключить @Scheduled.

+0

О, это позор - спасибо, что заглянул в него. Я думаю, что одно возможное обходное решение, не упомянутое в связанном вами сообщении, может заключаться в том, чтобы установить чрезвычайно высокие значения (например, max 'long') для' initialDelay' и 'fixedDelay', чтобы они никогда не достигались. Это может сработать на практике, но просто кажется, что это неправильно, и прискорбно, что Spring не предоставил вариант «никогда». –

+1

@SteveChambers Да, это похоже на хак. Плюс, если вы хотите получить значение из конфигурации и установить его с помощью 'fixedDelayStr', он будет анализироваться с использованием' Integer.parseInt' не 'Long.parseLong', поэтому установка его на максимальное значение long не удалась :) ... Я расскажу об этом позже в Spring JIRA. –

+0

О, боже, кажется, что 'fixedDelayStr' не может быть и речи для этого метода, тогда как максимальное целое число равно 2147483647, что (если мои расчеты с использованием Google правильны) в миллисекундах составляет всего 3 с половиной недели - бит отличается от 292471208 лет, я думаю, что 'long' позволит! –