Spring @Configuration (не-xml-конфигурация) для задач, управляемых аннотациями - PullRequest
7 голосов
/ 02 августа 2011

Может кто-нибудь объяснить, как выполнить базовую настройку задачи с помощью аннотации @Scheduled без какой-либо конфигурации XML? Все примеры, которые я могу найти, используют как минимум минимальную конфигурацию XML. Например:

http://blog.springsource.com/2010/01/05/task-scheduling-simplifications-in-spring-3-0/

Используется типичное:

  <context:component-scan base-package="org/springframework/samples/task/basic/annotation"/> 
  <task:annotation-driven/>

Так что я просто использую аннотацию @Configuration с кучей аннотаций @Bean. Все они создаются при запуске, но тот, у которого @Scheduled, не запускается. Я использовал эту аннотацию успешно в прошлом при использовании конфигурации XML, но никогда не только с аннотациями.

Ответы [ 4 ]

15 голосов
/ 23 августа 2012

Просто добавьте @EnableScheduling в свой класс WebMvcConfig

@Configuration
@EnableWebMvc
@EnableAsync
@EnableScheduling
public class WebMvcConfig extends WebMvcConfigurerAdapter {
   /** Annotations config Stuff ... **/
}
4 голосов
/ 02 августа 2011

Аннотация <task:annotation-driven /> заканчивается объявлением ScheduledAnnotationBeanPostProcessor для чтения аннотаций @Scheduled в вашем коде.Смотрите здесь: http://static.springsource.org/spring/docs/3.1.x/javadoc-api/org/springframework/scheduling/annotation/ScheduledAnnotationBeanPostProcessor.html.

Это касается линии <task:annotation-driven />.Чтобы получить сканирование компонента, вам нужно использовать AnnotationConfigApplicationContext.Не уверен, что / как это работает с веб-контейнером.

3 голосов
/ 02 августа 2011

В Spring 3.0 вам все еще нужен этот маленький кусочек XML.Тем не менее, Spring 3.1 (все еще в бета-версии) вводит дополнительные опции аннотации, чтобы сократить разрыв, устраняя необходимость в настройке XML.

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

1 голос
/ 19 августа 2015

Ответы до сих пор полезны для более ранних версий Spring.Вот тот, который немного больше приспособлен к Spring 4:

Предположим, что у вас есть основной класс приложения, аннотированный для сканирования компонентов, например:

@ComponentScan({"com.my.class"})

И внутри этого пакета у вас естькласс задания, который выглядит следующим образом:

@Configuration
@EnableScheduling
public class MyJobClass {
@Scheduled (cron = "* * * * * *")
public void runJob() throws DocumentException {
    thingsToDoOnSchedule(); 
   }
}

Обратите внимание, что метод, который вы аннотируете с помощью @Scheduled, должен возвращать void и что ваше выражение cron должно иметь 6 символов (пример, показанный здесь, выполняется каждую секунду, чтотестирование того, что ваша работа делает проще).

Вам также понадобятся аннотации на уровне класса как @Configuration, так и @EnableScheduling, чтобы сделать эту работу.Похоже, что любой из них сам по себе игнорируется.

Для дальнейшего прочтения здесь есть справочный документ о включении планирования Spring 4 .

...