Получить доступ

Что верно про события приложения и @EventListener в Spring?

MiddleКонтейнер изнутриSpring
Ещё спрашивают так:
  • Как работает @TransactionalEventListener?
Коротко

События ApplicationEventPublisher по умолчанию обрабатываются синхронно, в том же потоке и той же транзакции: исключение слушателя откатит публикатора. Асинхронность — явно через @Async.

  • @TransactionalEventListener(phase = AFTER_COMMIT) — только после коммита
  • После коммита сбой слушателя теряет событие — для надёжности outbox
  • Порядок слушателей — @Order

А ещё События внутри приложения не заменяют брокер между сервисами

Так подсказку видит пользователь sotto на живом собеседовании — за пару секунд, пока вы думаете вслух.

Подробно

Это самое частое заблуждение по теме: публикация события выглядит как «отправил и забыл», но фактически это обычный вызов метода. Поэтому медленный обработчик замедляет издателя, а брошенное им исключение доходит до вызывающего кода и откатывает транзакцию. Для отправки уведомлений после успешного сохранения нужен @TransactionalEventListener с фазой AFTER_COMMIT — иначе письмо уйдёт даже при откате. Для настоящей асинхронности добавляют @Async и включают @EnableAsync, но тогда обработчик выполняется вне транзакции издателя, и это надо учитывать.

Что хотят услышать

  • Синхронность и транзакция по умолчанию.
  • @Async и @TransactionalEventListener.
  • Ограничения надёжности.

Частые ошибки

  • Считать публикацию события асинхронной по умолчанию.
  • Отправлять внешние уведомления из обработчика до коммита.

Проверьте себя

Несколько верных вариантов. Подумайте, потом откройте ответ.

Показать варианты и ответ
  • ✓По умолчанию обработчик выполняется синхронно, в потоке и транзакции издателя
  • ✓Исключение в синхронном обработчике поднимется к издателю и может откатить его транзакцию
  • ✓@TransactionalEventListener позволяет отложить обработку до коммита транзакции
  • ✗События по умолчанию обрабатываются асинхронно в отдельном пуле потоков

Что спросят дальше

  • Что произойдёт с AFTER_COMMIT-обработчиком, если транзакция откатится?
  • Почему @Async-метод, вызванный внутри того же бина, не работает?

Разбор темы

Связанные вопросы

Закрытая бета

Подсказки на собеседовании — в реальном времени

sotto слышит вопрос интервьюера и показывает короткий ответ и план, как в блоке «Коротко». Оставьте контакт — пришлём доступ и промокод.

  • Промокод на 2 часа — сверх пробных 30 минут
  • Программа для Windows — скачать сразу, войти — через Яндекс ID или VK ID
  • Прямая связь с разработчиком: что улучшить — сделаем