1
Hi i am trying to create a XA transaction for camel and jdbc using atomikos but i have JNDI to set up a XA jdbc transaction i am having issues configuring it.  

Below is my code and i am getting cannot write to the class exception

 <!-- Atomikos and Spring transaction configuration  -->


    <!-- JMS config; with XAConnectionFactory -->


      <bean id="xa.amqConnectionFactory" class="org.apache.activemq.spring.ActiveMQXAConnectionFactory">
        <property name="brokerURL" value="tcp://localhost:61616"/>
      </bean>

      <!-- nothing transactional here, this connection factory will be used from the test harness -->
      <bean id="connectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory">
        <property name="brokerURL" value="tcp://localhost:61616"/>
      </bean>


      <!-- Atomikos JTA configuration, nothing specific to Spring here -->
      <bean id="atomikos.connectionFactory" class="com.atomikos.jms.AtomikosConnectionFactoryBean"
            init-method="init" destroy-method="close">
        <property name="uniqueResourceName" value="My_MQSeries_XA_RMI"/>
        <property name="xaConnectionFactory" ref="xa.amqConnectionFactory"/>
        <!-- XAConnectionFactory -->
        <property name="maxPoolSize" value="10"/>
        <property name="ignoreSessionTransactedFlag" value="false"/>
      </bean>


      <!-- database config; the XADataSource bean is both a DataSource and an XADataSource-->
      <!-- <import resource="xa-embedded-db-context.xml"/> -->

      <bean id="db2jndi" class="org.springframework.jndi.JndiObjectFactoryBean">
      <property name="jndiName" value = "jndi NAMe"/>

      </bean>

      <!-- <bean id="XADataSource" class="MyDAOclass">
      <property name="MyDAOmethod" ref="db2jndi"/>
      </bean> -->

      <bean id="atomikos.dataSource" class="com.atomikos.jdbc.AtomikosDataSourceBean">
        <property name="xaDataSource" ref="XADataSource"/>
        <!-- XADataSource -->
      </bean>


      <!-- javax.transaction.TransactionManager -->
      <bean id="atomikos.transactionManager"
            class="com.atomikos.icatch.jta.UserTransactionManager"
            init-method="init"
            destroy-method="close"
            depends-on="atomikos.connectionFactory,atomikos.dataSource">
        <property name="forceShutdown" value="false"/>
      </bean>

      <!-- javax.transaction.UserTransaction -->
      <bean id="atomikos.userTransaction"
            class="com.atomikos.icatch.jta.UserTransactionImp">
        <property name="transactionTimeout" value="300"/>
      </bean>

      <!-- This is the Spring wrapper over the JTA configuration -->
      <!-- org.springframework.transaction.PlatformTransactionManager -->
      <bean id="jta.transactionManager" class="org.springframework.transaction.jta.JtaTransactionManager">
        <property name="transactionManager" ref="atomikos.transactionManager"/>
        <property name="userTransaction" ref="atomikos.userTransaction"/>
      </bean>


      <!-- Camel components -->
      <bean id="jms" class="org.apache.activemq.camel.component.ActiveMQComponent">
        <property name="connectionFactory" ref="atomikos.connectionFactory"/>
        <property name="transactionManager" ref="jta.transactionManager"/>
      </bean>

      <!-- this component is used only from the test harness -->
      <bean id="nonTxJms" class="org.apache.activemq.camel.component.ActiveMQComponent">
        <property name="connectionFactory" ref="connectionFactory"/>
      </bean>

      <bean id="sql" class="org.apache.camel.component.sql.SqlComponent">
        <property name="dataSource" ref="atomikos.dataSource"/>
      </bean>

      <!-- Policy -->
      <bean id="PROPAGATION_REQUIRED" class="org.apache.camel.spring.spi.SpringTransactionPolicy">
        <property name="transactionManager" ref="jta.transactionManager"/>
        <!-- Atomikos TX Manager -->
        <property name="propagationBehaviorName" value="PROPAGATION_REQUIRED"/>
      </bean>

If anyone has worked on apache camel using XA transactions can you guys provide me your sample config file so that i can use and modify it.

kish
  • 85
  • 1
  • 13

1 Answers1

1

This works for me. It looks like you've missed the ActiveMQResourceManager. Also ensure you use a XAPooledConnectionFactory otherwise your MDBs will disconnect after every bind to check for a message (and CPU on the broker will go through the roof).

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="
      http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd">

    <bean id="env" class="java.lang.String">
        <constructor-arg value="test-junit"/>
    </bean>

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

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

    <bean id="pooledJmsXaConnectionFactory" class="org.apache.activemq.pool.XaPooledConnectionFactory"
        init-method="start" destroy-method="stop">
        <property name="maxConnections" value="8" />
        <property name="connectionFactory" ref="jmsXaConnectionFactory" />
        <property name="transactionManager" ref="atomikosTransactionManager" />
    </bean>

    <!-- <bean id="pooledJmsXaConnectionFactory" class="com.atomikos.jms.AtomikosConnectionFactoryBean" 
        init-method="init" destroy-method="close"> <property name="poolSize" value="8" 
        /> <property name="uniqueResourceName" value="activemq" /> <property name="xaConnectionFactory" 
        ref="jmsXaConnectionFactory" /> </bean> -->

    <bean id="jmsXaConnectionFactory" class="org.apache.activemq.ActiveMQXAConnectionFactory">
        <property name="brokerURL" value="tcp://localhost:61616" />
        <property name="redeliveryPolicy">
            <bean class="org.apache.activemq.RedeliveryPolicy">
                <property name="maximumRedeliveries" value="0" />
            </bean>
        </property>
    </bean>

    <bean id="jms" class="org.apache.activemq.camel.component.ActiveMQComponent">
        <property name="connectionFactory" ref="pooledJmsXaConnectionFactory" />
        <property name="transacted" value="false" />
        <property name="transactionManager" ref="transactionManager" />
    </bean>

    <!-- JMS configuration for test enqueue/dequeue without transactions -->
    <bean id="jmsConnectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory">
        <property name="brokerURL" value="tcp://localhost:61616" />
    </bean>


    <bean id="myEmf"
        class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
        <property name="dataSource" ref="dataSource" />
        <property name="jpaVendorAdapter">
            <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter" />
        </property>
        <property name="persistenceXmlLocation" value="classpath:META-INF/test-persistence.xml"/>
    </bean>

    <!-- JDBC configuration -->
    <bean id="dataSource" class="org.apache.commons.dbcp2.managed.BasicManagedDataSource">
        <property name="transactionManager" ref="atomikosTransactionManager" />
        <!-- <property name="driverClassName" value="org.apache.derby.jdbc.EmbeddedXADataSource40" /> -->
        <property name="driverClassName" value="org.apache.derby.jdbc.EmbeddedDriver" />
        <property name="url" value="jdbc:derby:target/testdb;create=true" />
        <property name="defaultAutoCommit" value="false" />
    </bean>

    <bean id="atomikosTransactionManager" class="com.atomikos.icatch.jta.UserTransactionManager"
        init-method="init" destroy-method="close">
        <property name="forceShutdown" value="false" />
    </bean>

    <bean id="userTransaction" class="com.atomikos.icatch.jta.UserTransactionImp">
        <property name="transactionTimeout" value="120" />
    </bean>

    <!--   -->
    <bean id="springContext" class="org.example.testutils.SpringContext"/>

</beans>
stringy05
  • 6,511
  • 32
  • 38