Порядок аспектов @Async и @Transaction
Используя Spring Boot 2.1.1.RELEASE / Spring Framework 5.1.4, у меня есть приложение с @Async
а также @Transactional
аннотации включены через:
@EnableAsync(mode = AdviceMode.ASPECTJ)
@EnableTransactionManagement(mode = AdviceMode.ASPECTJ)
При запуске метода, аннотируемого обоими, сначала создается транзакция, а затем начинается асинхронное выполнение. Таким образом, фактическое тело метода не выполняется внутри транзакции.
@Transactional
@Async
public void myAsyncMethod() {
// asynchronous database stuff
}
Как я могу настроить Spring / аспекты для фактического выполнения в порядке, который имеет смысл, например, начать транзакцию в новом потоке?
Кстати, с более старой версией Spring Boot 1.5.17 / Spring Framework 4.3.20 это работало.
Демо: https://github.com/jaarts/spring-asynctransaction-demo
0 ответов
In Spring 5 Async advice is always execited first. See AsyncAnnotationBeanPostProcessor
public AsyncAnnotationBeanPostProcessor() {
setBeforeExistingAdvisors(true);
}
After that on superclass in postProcessAfterInitialization when advisors aplies code executes
if (this.beforeExistingAdvisors) {
advised.addAdvisor(0, this.advisor);
}
On @EnableTransactionManagement#order javadoc says
Indicate the ordering of the execution of the transaction advisor
but on @EnableAsync
Indicate the order in which the AsyncAnnotationBeanPostProcessor should be applied.