Порядок аспектов @Async и @Transaction - PullRequest
0 голосов
/ 13 февраля 2019

Используя 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

1 Ответ

0 голосов
/ 20 августа 2019

Весной 5 Асинхронный совет всегда выполняется первым.См. AsyncAnnotationBeanPostProcessor

public AsyncAnnotationBeanPostProcessor() {
    setBeforeExistingAdvisors(true);
}

После этого для суперкласса в postProcessAfterInitialization, когда советники применяют код, выполняет

if (this.beforeExistingAdvisors) {
   advised.addAdvisor(0, this.advisor);
}

В @ EnableTransactionManagement # order javadoc говорит

Указывает порядоквыполнения советника по транзакциям

, но при @EnableAsync

Указывает порядок, в котором должен применяться AsyncAnnotationBeanPostProcessor.

...