Spring Boot, запланированное задание, двойной вызов

Получил довольно стандартное приложение Spring Boot (1.3.5).

Включено планирование с @EnableScheduling (пробовал на главной точке входа приложения и @Configuration аннотированный класс.

Создан простой класс с @Scheduled метод (простой график fixedDelay).

Запланированное задание выполняется дважды (всегда).

Из того, что я до сих пор собирал, это, вероятно, потому, что загружаются два контекста, и, таким образом, я собираю свои бобы дважды. Хорошо. Итак, как мне исправить / предотвратить это двойное выполнение, так как весь конфиг в основном скрыт волшебством Spring Boot?

Версии фреймворка:

  • Spring Boot 1.3.5
  • Весеннее Облако Brixton SR1

Основное применение:

   @SpringBootApplication
    @EnableDiscoveryClient
    @EnableAsync
    @EnableCircuitBreaker
    public class AlertsApplication {

    public static void main(final String[] args) {
        SpringApplication.run(AlertsApplication.class, args);
    }
}

Мой класс задач (список HookCreateRequest извлекается из application.yml - Я не считаю, что это актуально в настоящее время, но при необходимости может быть предоставлено):

@ConditionalOnProperty(name = "init.runner", havingValue = "InitRunner")
@ConfigurationProperties(prefix = "webhook")
public class InitRunner /*implements CommandLineRunner*/ {

    private final List<HookCreateRequest> receivers = new ArrayList<>();

    @Autowired
    private WebHookService hookService;

    @Scheduled (fixedRate = 300000)
    public void run() throws Exception {

        getReceivers().stream().forEach(item -> {
            log.debug("Request : {}", item);
            hookService.create(item);
        });

    }

    public List<HookCreateRequest> getReceivers() {
        return receivers;
    }

}

Существует нулевая конфигурация XML. Не уверен, что еще может быть актуальным?

РЕДАКТИРОВАТЬ 2016/07/04

Я изменил для вывода запланированного экземпляра при его запуске (я подозревал, что были созданы два разных экземпляра). Тем не менее, журналы, кажется, указывают, что это один и тот же экземпляр объекта задачи. журналы: 15:01:16.170 DEBUG - scheduled.ScheduleHookRecreation - Schedule task running: scheduled.ScheduleHookRecreation@705a651b ...task stuff happening ...first run completes, then: 15:01:39.050 DEBUG - scheduled.ScheduleHookRecreation - Schedule task running: scheduled.ScheduleHookRecreation@705a651b Так что казалось бы, это один и тот же экземпляр задачи (@705a651b). Теперь, почему во имя сладких вещей это будет выполнено дважды?

РЕДАКТИРОВАТЬ 2016/07/05

Я добавил @PostConstruct метод к классу, который несет запланированный метод, с некоторыми выходными данными регистрации. Сделав это, я мог убедиться, что @PostConstruct метод вызывается дважды, что, по-видимому, подтверждает, что бин выбирается дважды, что, вероятно, означает, что он подается в планировщик дважды. Так как это предотвратить?

1 ответ

Была такая же проблема, в моем случае причина была в @Scheduled аннотация-х initialDelay отсутствие параметра - метод вызывался при запуске приложения.

Другие вопросы по тегам