❓ Что происходит с @Async методом, если он вызывается из того же класса?
Self-invocation убивает прокси
Spring создаёт AOP-прокси вокруг бина. Когда ты вызываешь this.sendEmail(), вызов идёт напрямую к объекту, минуя прокси. @Async не срабатывает, метод выполняется синхронно в том же потоке. Никакого исключения — просто тихий фейл.
private метод — та же история.
CGLIB-прокси не может переопределить private метод. Spring либо кидает предупреждение в лог, либо молча игнорирует аннотацию.
⚠️ Ещё один подводный камень
Исключения внутри @Async метода не пробрасываются к вызывающему коду. Если метод возвращает void, исключение просто теряется (уходит в AsyncUncaughtExceptionHandler). Если Future — исключение обёрнуто и бросится только при вызове get().
📌 Как правильно
— Вынести @Async метод в отдельный бин и вызов пойдёт через прокси
— Настроить AsyncUncaughtExceptionHandler для обработки ошибок
— Возвращать CompletableFuture если нужно отслеживать результат
🐸 Библиотека собеса по Java
#spring
Post #1297
1.48K
- 👍 8
- ❤ 3
- 🔥 2