获取错误:无法提交在activemq中的全局事务中登记的资源

时间:2013-04-29 12:53:05

标签: activemq apache-camel distributed-transactions bitronix

请帮助解决Activemq和Oracle以及Bitronix上的XA事务问题。 我有一个activemq并使用camel.xml嵌入来将消息从一个队列路由到oracle db。 这是独立Activemq的conf文件夹中camel.xml文件的内容。

<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队列发送消息时,没有任何内容插入db并且消息从队列中出队,我在activemq日志中收到此错误: [org.apache.camel.RuntimeCamelException - java.sql.SQLException:无法提交资源  参加全球交易]


我也为Oracle DataBase运行了这些SQL脚本:

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

欢迎任何想法/解决方案! 感谢

1 个答案:

答案 0 :(得分:0)

查看camel jdbc component docs中的第一行,我找到了这个信息框

  

此组件不能用作事务客户端。如果您的路由中需要事务支持,则应使用SQL组件。