Планирование в настоящее время так часто используется для решения любых других задач, но, если оно реализовано неправильно, оно также может превратить вашу пятничную ночь в ад.

Здесь мы создадим простое приложение, чтобы продемонстрировать несколько действий
1. Как создать задачи планирования при весенней загрузке?
2. Как мы можем достичь задач cron?
3. Проблемы с запланированная аннотация
4. Конечно, быстрое решение этой проблемы

Начнем быстро. Загрузите стартовое приложение с www.start.spring.io и импортируйте в редактор. Ниже представлен наш основной класс приложения.

@SpringBootApplication
@EnableScheduling
public class TestScheduleApplication {

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

}

Теперь определите компонент и добавьте задачи планировщика.

@Component
public class ScheduleResource {

@Scheduled(fixedRate = 2000)
public void testSchedule() throws InterruptedException {
 System.out.println("Thread name ="+Thread.currentThread().getName() + " time = "+ LocalDateTime.now());
    }
}

Теперь это будет работать как шарм. Если вы хотите применить шаблоны cron, все, что вам нужно сделать, это предоставить шаблон cron, например, каждые 5 секунд -

@Scheduled(cron = "*/5 * * * * *")

Теперь давайте добавим в приложение еще один планировщик, который будет работать параллельно с ним, но с той же скоростью.

@Scheduled(fixedRate = 2000)
public void testSchedule1(){
    System.out.println("second method Thread name = "+Thread.currentThread().getName() + " time = "+ LocalDateTime.now());
}

Вот что вы получите на выходе:

Ждать! Есть что-то не очень хорошее. Оба планировщика используют один и тот же поток, то есть scheduling-1.
Теперь, чтобы сломать этот красивый код, мы можем просто добавить сон в любую задачу, и все журналы будут нарушены. Увидеть ниже-

Теперь наши задачи не запускаются каждые 2 секунды. Эта задержка будет продолжаться в аддоне. Сценарии в реальном времени могут быть чем угодно, например, если одним из методов является извлечение данных из базы данных, и что, если это займет в 4 раза больше времени, чем обычно. Из-за этого возникнет дополнительная задержка для другой задачи, которая может не быть связана с этой задачей.

Причина. Планировщик Spring использует один поток службы исполнителя для выполнения планирования. Вы можете использовать N задач параллельно, но проблема возникнет только тогда, когда одна из ваших задач выйдет из строя, а время второго запуска где-то изменится. Это произойдет, потому что для выполнения обеих задач используется один и тот же поток.

Решение- Простое решение - создать компонент и вернуть пул исполнителей из n потоков. При использовании нескольких планировщиков рекомендуется использовать пул потоков.
Еще одно быстрое решение - использовать свойство spring, которое было введено в v2.1.0 +. Этого легко добиться, добавив ниже в application.yml

spring.task.scheduling.pool.size=10

Теперь вы увидите, что обе задачи используют разные потоки, и даже если одна задача использует Thread.sleep (…), другая задача остается неизменной. Вот чего мы и хотели :)

Надеюсь, ваши пятницы не будут для вас более беспокойными. Продолжай читать. Продолжайте хлопать;)