Одна из известных проблем выполнения кода в асинхронном потоке заключается в том, что исключения, сгенерированные этим кодом, теряются , если не предоставлен специальный обработчик для их перехвата .Эффект, который вы видите (а именно, метод @Async
не может правильно выполнить и показать ключ к этому сбою в виде журнала или какой-либо трассировки стека), как правило, создается таким исключением, действительно выбрасывается, но проглатываетсяасинхронный поток.
Одна из многих возможных причин, по которым ваш метод @Async
работает в синхронном режиме, заключается в том, что вы выполняете какую-то операцию с базой данных из метода.Он работает в синхронном режиме, потому что вы, вероятно, вызываете его из @Transactional
метода другого @Service
, поэтому для этого потока найден Session
или EntityManager
;но он не работает в асинхронном режиме, потому что в этом случае вы находитесь в новом потоке, и если метод @Async
не является @Transactional
, то нет Session
или EntityManager
, которые могли бы выполнить операцию.
TL; DR Предоставить обработчик исключений для перехвата исключений, которые в противном случае были бы поглощены асинхронным потоком, или для отладки используйте большую try
/ catch
для тела метода @Async
.Возможно, вы увидите какое-то исключение, тогда вам нужно будет предпринять соответствующие действия, чтобы избежать его.