Senior
Šta će se desiti ako pozovete @Async metod iz ne-annotirane metode unutar istog beana?
sobes.tech АИ
Одговор од АИ
Если вызвать метод, аннотированный @Async, из другого метода того же бина, который не аннотирован, то асинхронность не сработает.
Причина в том, что Spring использует прокси для реализации @Async. При вызове метода внутри того же класса вызов происходит напрямую, минуя прокси, и аннотация игнорируется.
В результате метод выполнится синхронно в том же потоке.
Чтобы @Async сработал, вызов должен идти извне через прокси, например, из другого бина или через ApplicationContext.
Пример:
@Component
public class MyService {
@Async
public void asyncMethod() {
// выполняется асинхронно
}
public void syncMethod() {
asyncMethod(); // вызов внутри класса — будет синхронно
}
}
Чтобы исправить, можно:
- Вынести
asyncMethodв другой бин и вызывать его оттуда. - Использовать
ApplicationContextдля получения прокси и вызвать метод через него. - Или использовать
@EnableAsync(proxyTargetClass=true)и CGLIB прокси, но вызов внутри класса всё равно не проксируется.