получить ошибку: не удается зафиксировать ресурс, включенный в глобальную транзакцию в activemq

Не могли бы вы помочь решить проблему с транзакциями XA на Activemq и Oracle и Bitronix. У меня есть activemq и встроенный camel.xml для маршрутизации сообщений из одной очереди в oracle db. это содержимое файла camel.xml в папке conf автономного Activemq.

<camelContext id="camel" xmlns="http://camel.apache.org/schema/spring">

       <route id="partnerToDB">
            <from uri="activemqXa:example.A" />
             <transacted ref="PROPAGATION_REQUIRED"/>
            <transform>
                <simple>insert into tbl_1(body,type) values('${in.body}','P')  </simple>
            </transform>
            <to uri="jdbc:dataSource" />                
       </route>   


</camelContext>


 <!-- TX configuration -->

<bean id="jtaTransactionManager" class="org.springframework.transaction.jta.JtaTransactionManager">
    <property name="transactionManager" ref="transactionManager"/>
    <property name="userTransaction" ref="transactionManager" />
</bean>

<bean id="btmConfig" factory-method="getConfiguration" class="bitronix.tm.TransactionManagerServices">
    <property name="serverId" value="spring-btm" />
</bean>

<bean id="transactionManager" factory-method="getTransactionManager" class="bitronix.tm.TransactionManagerServices" depends-on="btmConfig" destroy-method="shutdown" />

<bean id="PROPAGATION_REQUIRED" class="org.apache.camel.spring.spi.SpringTransactionPolicy">
    <property name="transactionManager" ref="jtaTransactionManager"/>
    <property name="propagationBehaviorName" value="PROPAGATION_REQUIRED"/>
</bean>

<!-- JMS configuration -->

<bean id="resourceManager" class="org.apache.activemq.pool.ActiveMQResourceManager" init-method="recoverResource">
    <property name="transactionManager" ref="transactionManager" />
    <property name="connectionFactory" ref="pooledJmsXaConnectionFactory" />
     <property name="resourceName" value="activemq.default,java/testDS1" />
</bean> 

<bean id="pooledJmsXaConnectionFactory" class="bitronix.tm.resource.jms.PoolingConnectionFactory" init-method="init" destroy-method="close" >
    <property name="className" value="org.apache.activemq.ActiveMQXAConnectionFactory" />
    <property name="uniqueName" value="activemq" />
    <property name="maxPoolSize" value="8" />
    <property name="driverProperties">
        <props>
            <prop key="brokerURL">tcp://172.16.9.17:61617</prop>
        </props>
    </property>
</bean>

<bean id="activemqXa" class="org.apache.activemq.camel.component.ActiveMQComponent">
    <!-- because of https://issues.apache.org/jira/browse/AMQ-3251, we cannot use the XaPooledConnectionFactory in AMQ 5.5.1 -->
    <property name="connectionFactory" ref="pooledJmsXaConnectionFactory"/>
    <property name="transacted" value="false"/>
    <property name="transactionManager" ref="jtaTransactionManager"/>
</bean>


<!-- JDBC configuration -->

<bean id="dataSource" class="bitronix.tm.resource.jdbc.PoolingDataSource"
    init-method="init" destroy-method="close">
    <property name="className" value="bitronix.tm.resource.jdbc.lrc.LrcXADataSource" />
    <property name="uniqueName" value="java/testDS1" />
    <property name="maxPoolSize" value="5" />
    <property name="minPoolSize" value="0" />
    <property name="allowLocalTransactions" value="false" />
    <property name="testQuery" value="SELECT 1 FROM DUAL" />
    <property name="driverProperties">
        <props>
            <prop key="user">test</prop>
            <prop key="password">test</prop>
            <prop key="url">jdbc:oracle:thin:@db1sh:1521/org.amin.org</prop>
            <prop key="driverClassName">oracle.jdbc.OracleDriver</prop>
        </props>
    </property>
</bean> 

когда я запускаю Activemq и отправляю сообщение в очередь example.A, в БД ничего не вставляется, и сообщение удаляется из очереди, я получаю эту ошибку в журнале activemq: [org.apache.camel.RuntimeCamelException - java.sql.SQLException: не может зафиксировать ресурс, включенный в глобальную транзакцию]


Также я запустил эти сценарии SQL для Oracle DataBase:

$ORACLE_HOME/javavm/install/initxa.sql

$ORACLE_HOME/javavm/install/initjvm.sql

и следующие отчеты о грантах:

 grant select on pending_trans$ to public;

 grant select on dba_2pc_pending to public;

 grant select on dba_pending_transactions to public;

 grant execute on dbms_system to <user>; 

Любые идеи/решения приветствуются! Спасибо


person user2332070    schedule 29.04.2013    source источник


Ответы (1)


Глядя на первые строки в документации компонента jdbc для верблюдов, я нахожу это информационное поле

Этот компонент нельзя использовать в качестве транзакционного клиента. Если вам нужна поддержка транзакций на вашем маршруте, вы должны вместо этого использовать компонент SQL.

person Petter Nordlander    schedule 29.04.2013
comment
Спасибо, Петр, за быстрый и точный ответ. - person user2332070; 30.04.2013
comment
Я изменил jdbc и использую sql. Теперь у меня нет предыдущей ошибки, но если команда вставки не может работать в оракуле и получить ошибку, сообщение удаляется из очереди примера. что-то вроде нет ни одной транзакции. Можете ли вы помочь мне с этой проблемой? - person user2332070; 30.04.2013