ApplicationEvent

Тема дорожной карты · Spring Boot

События Spring-приложения — это лёгкий механизм публикации-подписки, встроенный в Spring Framework, позволяющий несвязанным компонентам Spring Boot-приложения общаться асинхронно без прямых вызовов методов. Базовым классом для всех событий является ApplicationEvent, однако начиная со Spring 4.2 любой обычный объект может публиковаться как событие: издатель вызывает ApplicationEventPublisher.publishEvent(myEvent) — внедрённый через @Autowired — а любой бин, реализующий ApplicationListener<MyEvent> или аннотированный @EventListener, получает обратный вызов. Сам Spring Boot генерирует несколько встроенных событий при запуске: ApplicationStartingEvent, ApplicationEnvironmentPreparedEvent, ApplicationContextInitializedEvent, ApplicationStartedEvent и ApplicationReadyEvent, обеспечивая тонко настроенные хуки жизненного цикла. Для асинхронного выполнения обработчиков @EventListener в отдельном пуле потоков аннотацию комбинируют с @Async и включают асинхронную обработку через @EnableAsync в классе @Configuration. События Spring-приложения идеально подходят для отделения сквозных задач — аудитного логирования, прогрева кэша или отправки уведомлений — от основной бизнес-логики в бинах @Service.

Как это работает

ApplicationEvent: 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 под нагрузкой).

Типичные ошибки

Ловушки ApplicationEvent: auto-commit Kafka offsets до обработки (тихая потеря данных); @Async с дефолтным executor (unbounded thread pool); нет DLQ (poison messages блокируют consumers навсегда); @Scheduled на single-instance cron в multi-replica деплое (запускается N раз — Shedlock или k8s CronJob).

Связанные понятия

Полезные ресурсы