0

Не могли бы вы помочь решить проблему с транзакциями XA в Activemq и Oracle и Bitronix. У меня есть activemq и с помощью camel.xml встраивается в сообщение маршрутизации из одной очереди в oracle db. это содержимое файла camel.xml в папке conf автономного Activemq.получить ошибку: не удалось зафиксировать ресурс, зачисленный в глобальную транзакцию в 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 

и следующий грант 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>; 

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

ответ

0

Глядя на первые строки в camel jdbc component docs найти эту информацию коробка

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

+0

Спасибо, за ваш быстрый и точный ответ. – user2332070

+0

Я изменил jdbc и использовал sql. Теперь у меня нет предыдущей ошибки, но если команда вставки не может работать в oracle и получить ошибку, сообщение будет удалено из примера. Очередь. что-то вроде этого нет никакой сделки. Можете ли вы помочь мне в решении этой проблемы? – user2332070