Планирование в настоящее время так часто используется для решения любых других задач, но, если оно реализовано неправильно, оно также может превратить вашу пятничную ночь в ад.
Здесь мы создадим простое приложение, чтобы продемонстрировать несколько действий
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 (…), другая задача остается неизменной. Вот чего мы и хотели :)
Надеюсь, ваши пятницы не будут для вас более беспокойными. Продолжай читать. Продолжайте хлопать;)