@Async на методе своего же класса — вызов проходит мимо proxy
Spring оборачивает бин в proxy для @Async, @Transactional, @Cacheable — но proxy перехватывает только внешние вызовы через интерфейс или CGLIB-наследование. Вызов метода внутри того же класса идёт напрямую, минуя proxy.
Аннотация при этом не выдаёт ошибку и не пишет предупреждение в лог — метод просто выполняется синхронно, в том же потоке, что и вызывающий код. На проде это заметят по времени отклика, на тестах — часто нет, потому что синхронное поведение иногда даже совпадает с ожиданием теста.
@Service public class ReportService {
public void generate() { exportAsync(); }
@Async public void exportAsync() { // выполняется синхронно } }
Спросят про способ исправить: вынести метод в отдельный бин и вызывать через внедрённую зависимость, либо получить self-proxy через AopContext.currentProxy() с exposeProxy = true.
Аннотация на методе — не гарантия, что она сработает. Гарантия — это то, как этот метод вызван.
Тренажёр: 600 вопросов, мок с таймером, план повторов
senior·base — что спрашивают на самом деле
В этом посте были ссылки, но мы их удалили по правилам Сетки