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

时间:2016-05-03 06:05:50

标签: 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>

DAO

<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持久失败时,事务没有回滚。 Entity1被插入到DB中。

其他信息

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类型,hibernate是提供者。

3)我有一个ExceptionMapper,当我调查它时,stacktrace显示事务确实被标记为回滚。

4)服务bean未分离到另一个包。

5)Hibernate autocommit不正确。

我想知道是否:

  1. CXF OutFaultInterceptor已经吃过&#34;吃掉了#34;应该由容器捕获的事务回滚异常。因此,没有发生回滚。

  2. 实体管理器必须是在所有DAO之间共享的相同实例才能实现回滚。

  3. 我是否需要将服务分成另一个包?

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

1 个答案:

答案 0 :(得分:2)

原始数据源在蓝图包中声明,该包使用commons-dbcp2。最后,我使用pax-jdbc-pool-dbcp version 0.8.0。

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

感谢Christian Schneider的暗示。