Spring Boot @Scheduled является синхронным или асинхронным? - PullRequest
0 голосов
/ 21 марта 2019

В нашем проекте мы используем Spring Boot 2.1.3. Пожалуйста, для задания планировщика мы использовали @Scheduled на уровне метода.

@Scheduled(fixedRate = 1000)
public void fixedRateSchedule() {
    System.out.println(
      "Fixed rate task - " + System.currentTimeMillis() / 1000);
}

Фиксированная ставка не ожидает выполнения предыдущего задания.

@Scheduled(fixedDelay = 1000)
    public void fixedDelaySchedule() {
        System.out.println(
          "Fixed delay task - " + System.currentTimeMillis() / 1000);
    }

Задача fixedDelay, всегда ожидает завершения предыдущего.

@Scheduled(cron = "0 0/5 * * * ?")
        public void fixedDelaySchedule() {
            System.out.println(
              "cron  task - " + System.currentTimeMillis() / 1000);
        }

Вышеупомянутый cron будет выполняться каждые пять минут, мой вопрос: будет ли @scheduled cron ждать завершения предыдущего задания, прежде чем запускать следующее задание, или нет?

1 Ответ

2 голосов
/ 21 марта 2019

@Scheduled методы выполняются асинхронно, но по умолчанию Spring Boot использует пул потоков размером 1, поэтому каждый метод будет выполняться по одному.

Чтобы изменить это, добавьте следующее к вашемуНастройка Spring Boot:

@Bean
public TaskScheduler taskScheduler() {
    ThreadPoolTaskScheduler taskScheduler = new ThreadPoolTaskScheduler();
    taskScheduler.setPoolSize(5);
    return taskScheduler;
}

Вот ссылка на исходный код ThreadPoolTaskScheduler .

...