Запланированные задачи
Тема дорожной карты · Spring Boot
Задачи @Scheduled в Spring Boot предоставляют лёгкий, аннотационно-управляемый механизм для выполнения методов по фиксированному расписанию внутри процесса приложения, без необходимости во внешнем планировщике задач, таком как Quartz или cron. Для включения запланированных задач необходимо добавить @EnableScheduling к классу @Configuration; после этого любой метод @Service или @Component, аннотированный @Scheduled, регистрируется в TaskScheduler Spring и выполняется автоматически. Аннотация принимает fixedRate, fixedDelay или стандартное cron-выражение — @Scheduled(cron = "0 0 2 * * *") запускает метод ежедневно в 02:00 — и поддерживает zone для учёта часового пояса, что важно, когда Spring Boot-приложения работают в географически распределённых Kubernetes-кластерах. По умолчанию все задачи @Scheduled используют один поток; замена его бином ThreadPoolTaskScheduler открывает параллельное выполнение, предотвращая блокировку критической задачи сброса метрик медленной задачей очистки базы данных. Задачи @Scheduled естественно интегрируются с Spring Boot Actuator для мониторинга выполнения задач, Spring Data для пакетных операций с базой данных и Spring Profiles, позволяя полностью отключать задания в тестовых средах через @Profile("!test").
Как это работает
Запланированные задачи: Spring Kafka (@KafkaListener + KafkaTemplate) для high-throughput event streaming. Spring AMQP (@RabbitListener + RabbitTemplate) для RabbitMQ. @Scheduled cron-style scheduling; @Async для fire-and-forget задач (с явным executor — никогда дефолт). ApplicationEvent + @EventListener для in-process pub/sub. Выбирайте Kafka для streams + replay; RabbitMQ для routing-heavy work queues; in-process events для decoupling внутри одного app.
Когда применять
Consumer groups + offsets конфигурируйте тщательно (auto-commit прячет баги). Всегда handle poison messages (DLQ или dead-letter topic). Idempotent consumers — at-least-once delivery норма. Для @Async сконфигурируйте bounded executor (дефолт unbounded — OOM под нагрузкой).
Типичные ошибки
Ловушки Запланированные задачи: auto-commit Kafka offsets до обработки (тихая потеря данных); @Async с дефолтным executor (unbounded thread pool); нет DLQ (poison messages блокируют consumers навсегда); @Scheduled на single-instance cron в multi-replica деплое (запускается N раз — Shedlock или k8s CronJob).