Что верно про события приложения и @EventListener в Spring?
- Как работает @TransactionalEventListener?
События ApplicationEventPublisher по умолчанию обрабатываются синхронно, в том же потоке и той же транзакции: исключение слушателя откатит публикатора. Асинхронность — явно через @Async.
- @TransactionalEventListener(phase = AFTER_COMMIT) — только после коммита
- После коммита сбой слушателя теряет событие — для надёжности outbox
- Порядок слушателей — @Order
А ещё События внутри приложения не заменяют брокер между сервисами
Подробно
Это самое частое заблуждение по теме: публикация события выглядит как «отправил и забыл», но фактически это обычный вызов метода. Поэтому медленный обработчик замедляет издателя, а брошенное им исключение доходит до вызывающего кода и откатывает транзакцию. Для отправки уведомлений после успешного сохранения нужен @TransactionalEventListener с фазой AFTER_COMMIT — иначе письмо уйдёт даже при откате. Для настоящей асинхронности добавляют @Async и включают @EnableAsync, но тогда обработчик выполняется вне транзакции издателя, и это надо учитывать.
Что хотят услышать
- Синхронность и транзакция по умолчанию.
- @Async и @TransactionalEventListener.
- Ограничения надёжности.
Частые ошибки
- Считать публикацию события асинхронной по умолчанию.
- Отправлять внешние уведомления из обработчика до коммита.
Проверьте себя
Несколько верных вариантов. Подумайте, потом откройте ответ.
Показать варианты и ответ
- ✓По умолчанию обработчик синхронный — в потоке и транзакции издателя
- ✓Исключение в обработчике дойдёт до издателя и может откатить транзакцию
- ✓@TransactionalEventListener откладывает обработку до коммита
- ✗События по умолчанию обрабатываются асинхронно в отдельном пуле потоков, не блокируя издателя
Что спросят дальше
- Что произойдёт с AFTER_COMMIT-обработчиком, если транзакция откатится?
- Почему @Async-метод, вызванный внутри того же бина, не работает?
Разбор темы
- Контейнер: события, FactoryBean и тонкое связывание
События приложения и @EventListener, FactoryBean, Aware-интерфейсы, порядок бинов (@Order/@DependsOn) и отложенное получение (ObjectProvider/@Lazy/@Lookup).
Связанные вопросы
Разбор собеседования с sotto
После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.