Spring SDN 4.1 и @Async в методе @Transactional

У меня есть метод a в классе A, который вызывает метод b в классе B

@Service
public class A {
    private B classB;
    ...

    @Async
    @Transactional
    public void a() {
        classB.b();
    }
}

@Service
public class B {
    ...

    @Transactional
    public void b() {
        // load some nodes from neo4j db by GraphRepository
    }
}

это моя конфигурация neo4j

@Override
@Bean
@Scope(value = "prototype", proxyMode = ScopedProxyMode.TARGET_CLASS)    
public Session getSession() throws Exception {
    return super.getSession();
}

Согласно аннотации Async, я установил значение области для prototype, но это все еще не работает.

org.neo4j.ogm.exception.TransactionManagerException: транзакция не является текущей для этого потока на org.neo4j.ogm.session.transaction.DefaultTransactionManager.commit (DefaultTransactionManager.java:100) ~ [neo4j-ogm-core-2.0.1. jar :?] на org.neo4j.ogm.transaction.AbstractTransaction.commit (AbstractTransaction.java:83) ~ [neo4j-ogm-api-2.0.2.jar :?] на org.neo4j.ogm.drivers.bolt. transaction.BoltTransaction.commit (BoltTransaction.java:80) ~ [neo4j-ogm-bolt-driver-2.0.2.jar :?] в org.springframework.data.neo4j.transaction.Neo4jTransactionManager.commit (Neo4jTransactionManager.java:50 ) ~ [spring-data-neo4j-4.1.1.RELEASE.jar :?] в org.springframework.transaction.interceptor.TransactionAspectSupport.commitTransactionAfterReturning (TransactionAspectSupport.java:485) ~ [spring-tx-4.2.5.RELEASE. jar: 4.2.5.RELEASE] в org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction (TransactionAspectSupport.java:291) [ spring-tx-4.2.5.RELEASE.jar: 4.2.5.RELEASE] в org.springframework.transaction.interceptor.TransactionInterceptor.invoke (TransactionInterceptor.java:96) ~ [spring-tx-4.2.5.RELEASE.jar : 4.2.5.RELEASE] в org.springframework.aop.framework.ReflectiveMethodInvocation.proceed (ReflectiveMethodInvocation.java:179) ~ [spring-aop-4.2.5.RELEASE.jar: 4.2.5.RELEASE] в orwork.springframe .aop.framework.CglibAopProxy $ DynamicAdvisedInterceptor.intercept (CglibAopProxy.java:655) ~ [spring-aop-4.2.5.RELEASE.jar: 4.2.5.RELEASE]

Я использовал ту же технику с другим проектом с SDN 4.0.0, и это работает.

Может быть ошибка в SDN 4.1.1 и Ogm 2.0.3?


person aGO    schedule 09.06.2016    source источник


Ответы (1)


Во-первых, активировали ли вы @EnableAsync своим @Configuration классом?

Во-вторых, если вы не используете Spring Web-MVC или веб-приложение с поддержкой Spring, вам не нужно изменять поведение области действия Session, поэтому вы можете просто удалить эту строку.

Наконец, поскольку вы используете @Async с @Transactional, вам нужно будет убедиться, что вы также EnableTransactionManagement(proxyTargetClass=true) в своем классе @Configuration.

Если вы обнаружите, что проблема не решена, попробуйте выполнить обновление (после выполнения всего вышеперечисленного) до SDN 4.2.0-SNAPSHOT-BUILD.

@Async весной

person digx1    schedule 16.06.2016