2015-08-24 5 views
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. 

Ниже мой код и я получаю не могу писать в классе исключениеКак создать апачское соединение верблюда XA с помощью JNDI в Atomikos

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

Если кто-нибудь работали на Apache Camel с использованием XA транзакций могут вам ребята предоставляют мне ваш образец файла конфигурации, чтобы я мог его использовать и модифицировать.

ответ

1

Это работает для меня. Похоже, вы пропустили ActiveMQResourceManager. Также убедитесь, что вы используете XAPooledConnectionFactory, иначе ваши MDB будут отключены после каждого связывания, чтобы проверить сообщение (и процессор на брокерах будет проходить через крышу).

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