весной 3 запланированное задание выполняется 3 раза - PullRequest
9 голосов
/ 09 сентября 2010

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

@Component
public class SimpleTask {

    @Scheduled(fixedRate=10000)
    public void first() {
        System.out.println("Simple Task  " + new Date());
    }
}

Config:

<task:annotation-driven executor="myExecutor" scheduler="myScheduler" />
<task:executor id="myExecutor" pool-size="5"  /> 
<task:scheduler id="myScheduler" pool-size="10"  />

Моя проблема в том, что мой метод вызывается 3 раза каждые 10 секунд. Это должно быть вызвано только один раз. Что я делаю неправильно? Я использую Spring Source ToolSuite с SpringSource tc Server 6.

Ответы [ 3 ]

22 голосов
/ 03 декабря 2010

У меня была такая же проблема.Одной из причин является ошибка в Spring 3.0.0.Я обновился до 3.0.5, и количество повторений уменьшилось до двух.

Другая причина была в том, что мой класс с методом @Scheduled получал экземпляр дважды.Это произошло потому, что контекстная конфигурация загружалась дважды.В web.xml я указывал мои ContextLoaderListener и DispatcherServlet на один и тот же файл конфигурации контекста:

...
<listener>
  <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

<servlet>
<servlet-name>spring</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
  <param-name>contextConfigLocation</param-name>
  <param-value>/WEB-INF/applicationContext.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
...

WEB-INF / applicationContext.xml - это конфигурация контекста по умолчанию для ContextLoaderListener.Поэтому убедитесь, что ваш ContextLoaderListener и ServletDispatcher используют разные контекстные файлы.Я закончил тем, что создал /WEB-INF/spring-servlet.xml без каких-либо определений бина, и он работал безупречно.

2 голосов
/ 09 сентября 2010

вы смешиваете аннотации с конфигурацией, и я не думаю, что вам нужны оба

http://static.springsource.org/spring/docs/current/spring-framework-reference/html/scheduling.html#scheduling-task-namespace

Из документации

Примечание Убедитесь, что вы не инициализируете несколько экземпляров одного и того же класса аннотации @Scheduled во время выполнения, если только вы не хотите планировать обратные вызовы для каждого такого экземпляра.В связи с этим убедитесь, что вы не используете @Configurable для классов bean-компонентов, которые аннотированы @Scheduled и зарегистрированы как обычные Spring-компоненты с контейнером: в противном случае вы получите двойную инициализацию, один раз через контейнер и один раз через аспект @Configurable, после чего каждый метод @Scheduled вызывается дважды.

1 голос
/ 22 октября 2010

может быть, вы загружаете applicationContext несколько раз?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...