Sobes.tech
Назад к вопросам
Senior
5

Что произойдёт если вызвать @Async метод из не-аннотированного метода внутри одного бина?

Компании, где спрашивали
СБЕРСБЕР

Ответ от нейросети

sobes.tech AI

Если вызвать метод, аннотированный @Async, из другого метода того же бина, который не аннотирован, то асинхронность не сработает.

Причина в том, что Spring использует прокси для реализации @Async. При вызове метода внутри того же класса вызов происходит напрямую, минуя прокси, и аннотация игнорируется.

В результате метод выполнится синхронно в том же потоке.

Чтобы @Async сработал, вызов должен идти извне через прокси, например, из другого бина или через ApplicationContext.

Пример:

@Component
public class MyService {

    @Async
    public void asyncMethod() {
        // выполняется асинхронно
    }

    public void syncMethod() {
        asyncMethod(); // вызов внутри класса — будет синхронно
    }
}

Чтобы исправить, можно:

  • Вынести asyncMethod в другой бин и вызывать его оттуда.
  • Использовать ApplicationContext для получения прокси и вызвать метод через него.
  • Или использовать @EnableAsync(proxyTargetClass=true) и CGLIB прокси, но вызов внутри класса всё равно не проксируется.