2017-02-15 4 views
1

У меня есть задание @Scheduled в моем приложении, которое настраивается с помощью CRON и запускается каждые 4 часа. Проблема, с которой я сталкиваюсь, заключается в том, что задание CRON начинается не сразу после запуска приложения, но начинается через 4 часа после запуска приложения.Spring Запланированная задача не запускается при запуске приложения

Я попытался использовать метод @PostConstruct внутри задачи, чтобы вызвать его, но это приводит к ошибке из-за неинициализированного контекста Spring.

Пожалуйста, расскажите, как я могу запустить Запланированную задачу сразу после развертывания приложения, а затем через каждые 4 часа после развертывания.

EDIT:
Я бы не стал использовать @PostConstruct, так как мой запланирован метод зависит от других Бобы, которые не инициализированы, когда этот метод PostConstruct работает по какой-то причине.

+0

Возможный дубликат [Выполнить метод при запуске весной] (http://stackoverflow.com/questions/2401489/execute-method-on-startup-in-spring) – aUserHimself

+0

Я пробовал '@ PostContruct', но он всегда бросал Не удалось загрузить исключение контекста приложения – v1shnu

+1

Почему бы не использовать два запланированных метода, один из которых вызывает бизнес-код при запуске с фиксированным далеком Long.maxValue, а другой с аннотацией cron, чтобы вызывать его регулярно каждые 4 часа? Вы должны были бы разложить свой бизнес-код на отдельный метод. – user152468

ответ

0

Просто укажите метод, который вы хотите запустить в атрибуте bean-компонента init_method.

Java конфигурации: @Bean(init_method="methodWhichStartsTask")

XML конфигурации: <bean id="someId" class="com.example.Clazz" init-method="methodWhichStartsTask"/>

Это будет вызывать метод только после того, как боб правильно инициализирован и если метод планируется, то она будет называться впоследствии каждые 4 часа.

+0

Скажите, пожалуйста, если метод init будет вызван только после того, как приложение будет полностью загружено. Поскольку мой метод использует методы в других классах, у которых есть еще не загруженные компоненты. – v1shnu

+0

да. Spring должен вызывать только init-метод, когда это безопасно (т. Е. Весь контекст приложения был инициализирован) –

+0

может ли этот init_method использоваться как опция для '@ Service'? – v1shnu

0

Я не уверен, если вы попробовали это, но вы можете использовать @Scheduled с initialDelay

Для фиксированной задержки и фиксированная ставка задач, первоначальная задержка может быть определена с указанием количества миллисекунд подождать до первый выполнение метода.

https://docs.spring.io/spring/docs/current/spring-framework-reference/html/scheduling.html#scheduling-annotation-support-scheduled

@Scheduled(initialDelay=0, fixedRate=5000) 
public void doSomething() { 
    // something that should execute periodically 
} 

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

+0

Да, я подумал об этом. Начальная задержка 0 начнет работу сразу, но я использую cron вместо fixedDelay или fixedRate. Так будет ли это работать? – v1shnu

+0

Кажется, что они несовместимы, см. [This] (http://stackoverflow.com/questions/36765624/the-initial-delay-attribute-may-not-be-used-with-cron-and-trigger-tasks), вы можете найти решение. Рекомендуется использовать 'fixedDelay'. – px06

+0

Cron более подходит в моем случае использования. Поэтому я бы предпочел не использовать фиксированную задержку. Потому что 4 часа могут быть изменены на каждый один или два дня в непиковые сезоны. Поэтому было бы правильно использовать cron. – v1shnu

0

Вместо cron внутри @Scheduled используйте fixedRate, как показано ниже. По умолчанию initialDelay -1, который начнется сразу же, или вы можете установить 0.

@Scheduled(fixedRate=4*60*60*1000) 
public void test() { 
    System.out.println("helloworld"); 
} 
+0

Cron более подходит в моем случае использования. Поэтому я бы предпочел не использовать фиксированную задержку. Потому что 4 часа могут быть изменены на каждый один или два дня в непиковые сезоны. Поэтому было бы правильно использовать cron. – v1shnu

+0

Кроме того, поскольку initialDelay равен -1 по умолчанию, будет ли он работать вместе с cron? – v1shnu

+0

nope, он работает только с fixedRate и fixedDelay – mhshimul

1

К 0 */4 * * * Вы определяете «В минуту 0 мимо каждый 4 часа (0:00, 4:00 , 8:00 и т. Д.) », Который не находится во время запуска, а затем каждые 4 часа, как я думаю, вы хотите. Вы можете задать начальную задержку и скорость по:

@Scheduled(initialDelay=0, fixedRate=4*60*60*1000) 

Если вы беспокоитесь о жестко закодированных значений, вы можете предоставить значение конфигурации:

@Scheduled(initialDelay=0, fixedRateString = "${some.config.string}") 
+0

. Крон более подходит в моем случае использования. Поэтому я бы предпочел не использовать фиксированную задержку. Потому что 4 часа могут быть изменены на каждый один или два дня в непиковые сезоны моего заявления. Поэтому было бы правильно использовать cron, поскольку его более объяснительные – v1shnu

0

Если вы хотите использовать @PostConstructor, вы можно использовать BeanPostProcessor весной:

Цитата:

http://www.dineshonjava.com/2012/07/writing-beanpostprocessor-in-spring.html

BeanPostProcessor - это интерфейс, который сообщает Spring, чтобы выполнить некоторую обработку после инициализации некоторых компонентов. Это позволяет добавить некоторую пользовательскую логику (позволяет модифицировать экземпляр компонента) до и после создания Spring bean.

1. Создайте новый bean-элемент в Spring Inversion of Control. Xml-файл и bean-класс - это ваш путь к контроллеру (@Controller). Дайте путь id и class и init-method к bean.

<bean init-method="initMethod" class="com.example.sampleController" id="sampleController"></bean> 

2.Create новый метод общественного недействительными, что имя это имя Init-метода (e.g.:initMethod) в файле Xml и создать @PostConstructor аннотацию для этого метода.

@PostConstruct 
public void initEmployeeMasters() { 
    System.out.println("Init method is executed"); 
} 

3. Выполните свой Tomcat и следуйте за консолью.

Образец находится в ссылке:

https://github.com/ridvannistelrooy/Spring_Framework/tree/master/src/_001/_21/postconstruct_predestroy

-1

пользователя @EnableScheduling аннотаций на классе, который содержит you1 запланированный метод:

см пружинный документ:

Чтобы включить поддержку аннотаций @Scheduled и @Async, добавьте @EnableScheduling и @EnableAsync к одному из ваших @Configuration классов:

@Configuration 
@EnableAsync 
@EnableScheduling 
public class AppConfig { 
} 

ссылка: https://docs.spring.io/spring/docs/current/spring-framework-reference/html/scheduling.html

0

Я был @EnableScheduling в моем приложении конфигурации. У меня был @Scheduled(fixedDelay=5000) в моем заданном классе задач. Даже тогда это не сработало.

Я добавил @Service в мой запланированный класс задач, и все сработало нормально.

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