apache-camel - JTA 容器管理的事务回滚不适用于 jaxrs 端点

标签 apache-camel jax-rs jta jbossfuse aries

休息终点

<jaxrs:server id="jaxrs" 
              address="http://127.0.0.1:8080/jaxrs">

    <jaxrs:serviceBeans>
        <ref component-id="service1" />
        ...
        ...
        <ref component-id="serviceX" />
    </jaxrs:serviceBeans>
    <jaxrs:providers>
        <ref component-id="runtimeExceptionMapper" />
    </jaxrs:providers>
</jaxrs:server>

路线
<route id="secureBridgeRoute">
    <from uri="jetty:https://0.0.0.0:443/jaxrs?sslContextParametersRef=sslContextParameters&amp;matchOnUriPrefix=true&amp;minThreads=8&amp;maxThreads=16" />
    <transacted ref="JTA_TRANSACTION" />
    <to uri="jetty:http://127.0.0.1:8080/jaxrs?bridgeEndpoint=true&amp;throwExceptionOnFailure=true" />
</route>


<bean id="dao1" class="com.example.Dao1" activation="eager">
    <jpa:context unitname="PU" property="entityManager" type="TRANSACTION" />
</bean>

服务 bean
<bean id="service1" class="com.example.Service1" activation="eager">
    <property name="dao1" ref="dao1" />
    <property name="dao2" ref="dao2" />
    <tx:transaction method="*" value="Required" />
</bean>

服务 bean 方法伪代码
boolean create(entity1, entity2) {
    dao1.persist(entity1);
    dao2.persist(entity2);
}

当 dao2 persist 失败时,事务没有回滚。 Entity1 被插入到数据库中。

附加信息

1)TransactionManager定义
<reference id="platformTransactionManager" interface="org.springframework.transaction.PlatformTransactionManager" />
<bean id="JTA_TRANSACTION" class="org.apache.camel.spring.spi.SpringTransactionPolicy">
    <property name="transactionManager" ref="platformTransactionManager" />
    <property name="propagationBehaviorName" value="PROPAGATION_REQUIRED" />
</bean>

2) 我的持久单元是 JTA 类型,并且作为提供者休眠。

3) 我有一个 ExceptionMapper,当我查看它时,堆栈跟踪显示事务确实被标记为回滚。

4) 服务bean 没有分离到另一个bundle。

5) 休眠自动提交不是真的。

我想知道是否:
  • CXF OutFaultInterceptor 已经“吃掉”了应该被容器捕获以进行事务回滚的异常。结果,没有发生回滚。
  • 实体管理器必须是在所有 DAO 之间共享的相同实例才能发生回滚。
  • 难道我需要将服务分成另一个包?

  • 感谢有人能让我知道 cxf jaxrs 端点的服务层事务处理的正确方法。

    最佳答案

    原始数据源在使用 commons-dbcp2 的蓝图包中声明。最后,我使用 pax-jdbc-pool-dbcp 0.8.0 版完成了这项工作。

    引用:https://ops4j1.jira.com/wiki/display/PAXJDBC/Pooling+and+XA+support+for+DataSourceFactory

    感谢 Christian Schneider 的提示。

    关于apache-camel - JTA 容器管理的事务回滚不适用于 jaxrs 端点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36996780/

    相关文章:

    apache-camel - Camel SMPP - 服务器

    java - JAX-RS - JSON 属性值中关联对象的 toString()

    java - HashMap 的 XMLAdapter

    spring-boot - 使用spring boot,它如何检测JTA环境?

    java - 有没有办法从属性文件值设置其余配置 header ?

    web-services - 在 jboss fuse 中使用 cxf 的 Web 服务端点

    JavaMail 使用来自 sun 内部 "saaj"包的 MimeMultipart

    java - Jersey 的 PreProcessInterceptor

    java - 微服务系统中服务间的分布式事务,使用spring-cloud

    java - 是否可以在一个事务中使用多个持久化单元,而不是 XA?