Что проверяет вопрос про @Order у методов @EventListener
Спрашивают не про синтаксис аннотации, а про то, понимаете ли вы разницу между порядком вызова слушателей одного события и гарантиями транзакционности между ними.
@Order задаёт порядок выполнения нескольких @EventListener на одно и то же событие внутри одного потока. Меньшее значение — раньше вызов. Но это не связывает слушателей транзакционно: если первый слушатель бросит исключение, поведение остальных зависит от того, синхронный ли листенер и есть ли у события транзакционный контекст.
Отдельная ловушка — сочетание с @Async. Если один из листенеров асинхронный, порядок из @Order перестаёт что-либо гарантировать между синхронными и асинхронными обработчиками: асинхронный уйдёт в отдельный поток независимо от того, какой @Order у него стоит.
@EventListener @Order(1) public void reserveStock(OrderCreatedEvent event) { stockService.reserve(event.getOrderId()); }
@EventListener @Order(2) public void sendNotification(OrderCreatedEvent event) { notificationService.notify(event.getOrderId()); }
Спросят следом: что случится, если слушатель с @Order(1) выбросит исключение — выполнится ли слушатель с @Order(2)? Нет, если оба синхронные и в одном потоке: исключение из первого прервёт публикацию события целиком, второй не вызовется. Если нужна изоляция между слушателями — их разносят по разным событиям или оборачивают в try/catch внутри каждого.
@Order упорядочивает вызов, а не гарантирует изоляцию сбоя одного листенера от других.
Тренажёр: 600 вопросов, мок с таймером, план повторов
senior·base — что спрашивают на самом деле
В этом посте были ссылки, но мы их удалили по правилам Сетки