Domanda

Could you please help to solve the problem with XA transactions on Activemq and Oracle and Bitronix. I have a activemq and using camel.xml embeded in for routing message from one queue to oracle db. this is the content of camel.xml file in conf folder of standalone 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> 

when I run Activemq and send a message to example.A queue, nothing is inserted on db and message is dequeued from queue, I get this error in activemq log: [org.apache.camel.RuntimeCamelException - java.sql.SQLException: cannot commit a resource enlisted in a global transaction]


Also I have run these SQL scripts for Oracle DataBase:

$ORACLE_HOME/javavm/install/initxa.sql

$ORACLE_HOME/javavm/install/initjvm.sql

and the following grant statments:

 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>; 

Any ideas/solutions are welcome! Thanks

È stato utile?

Soluzione

Looking at the first lines in the camel jdbc component docs I find this information box

This component can not be used as a Transactional Client. If you need transaction support in your route, you should use the SQL component instead.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top