Откат транзакции, управляемый контейнером JTA, не работает для конечной точки jaxrs

Конечная точка отдыха

<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 id="service1" class="com.example.Service1" activation="eager">
    <property name="dao1" ref="dao1" />
    <property name="dao2" ref="dao2" />
    <tx:transaction method="*" value="Required" />
</bean>

Псевдокод метода сервисного компонента

boolean create(entity1, entity2) {
    dao1.persist(entity1);
    dao2.persist(entity2);
}

При сбое сохранения dao2 транзакция не откатывается. Entity1 вставляется в БД.

Дополнительная информация

1) определение диспетчера транзакций

<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) Сервисные компоненты не выделяются в другой пакет.

5) Hibernate autocommit НЕ соответствует действительности.

Мне интересно, если:

  1. CXF OutFaultInterceptor «съел» исключение, которое должно быть перехвачено контейнером для отката транзакции. В итоге отката не произошло.

  2. Entity Manager должен быть одним и тем же экземпляром, общим для всех DAO, чтобы произошел откат.

  3. Может быть, мне нужно выделить услугу в другой пакет?

Спасибо, если кто-то может сообщить мне правильный подход к обработке транзакций на уровне обслуживания для конечной точки cxf jaxrs.


person allancth    schedule 03.05.2016    source источник


Ответы (1)


Исходный источник данных объявлен в пакете чертежей, который использует commons-dbcp2. Наконец, я заработал, используя pax-jdbc-pool-dbcp версии 0.8.0.

Ссылка: https://ops4j1.jira.com/wiki/display/PAXJDBC/Pooling+and+XA+support+for+DataSourceFactory

Спасибо Кристиану Шнайдеру за подсказку.

person allancth    schedule 08.05.2016