activemq-users mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Pavel Khozhainov" <pavel.khozhai...@consumerhealthtech.com>
Subject Need a sample of using XA transaction inside camel script with Servicemix
Date Thu, 09 Apr 2009 08:34:51 GMT
Hi all

I need to
1. receive jms
2. update db
3. send jms
inside one XA transaction possible in one route.

Transaction manager is taken form  Servicemix jndi:
It was Jenks tm and it works with XA transactions

    <bean id="txTransactionManager" 
class="org.springframework.jndi.JndiObjectFactoryBean">
        <property name="jndiName" 
value="java:comp/env/smx/TransactionManager" />
    </bean>

JMS connection factory is good too

    <bean id="connectionFactory" 
class="org.jencks.amqpool.XaPooledConnectionFactory">
        <constructor-arg value="${jms.broker.url}"/>

        <property name="maxConnections" value="8" />
        <property name="transactionManager" ref="txTransactionManager" />
    </bean>

Next step I specify my db2 datasource

    <bean id="dataSource"
        class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="driverClassName" value="com.ibm.db2.jcc.DB2Driver" 
/>
        <property name="url" 
value="jdbc:db2://${db.host}:${db.port}/${db.name}" />
        <property name="username" value="${db.username}" />
        <property name="password" value="${db.password}" />
        <property name="connectionProperties">
            <props>
                <prop key="currentSchema">${db.schema}</prop>
            </props>
        </property>
    </bean>

I can not create real DB2XADataSource because it was DB2JccDataSource not 
java.sql.DataSource
(is the problem here?)

Next step is sessionFactory

    <bean id="sessionFactory" 
class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">

        <property name="jtaTransactionManager" ref="txTransactionManager"/>
        <property name="dataSource" ref="dataSource" />
        <property name="annotatedClasses">
            <list>
... mappings
            </list>
        </property>
        <property name="hibernateProperties">
            <props>
    ... props
            </props>
        </property>
    </bean>

looks normal

Last step is to specify policy - taken from sample

    <bean id="required" 
class="org.apache.camel.spring.spi.SpringTransactionPolicy">
        <property name="template" ref="PROPAGATION_REQUIRED"/>
    </bean>

    <bean id="PROPAGATION_REQUIRED"
        class="org.springframework.transaction.support.TransactionTemplate">
        <property name="transactionManager" ref="txTransactionManager"/>
    </bean>

I write my camel route i following way

        <route errorHandlerRef="deadLetterErrorHandler">

            <from uri="jms:queue:test.tran.01"/>

            <policy ref="required"/>

            <to uri = "bean:rendererBean?methodName=process"/>

            <setBody><el><![CDATA[<message>test</message>]]></el></setBody>

            <to uri = "jms:queue:test.tran.02"/>

        </route>

Problem
When process() method of my bean is called xa transaction was not open.
I expect that <policy step will open it but this was not happen.

Please tell me what to do
- must I specify "xa" somehere as I do with jms eip component?

It is a good idea to add camel xa sample to set of samples
__________
Pavel 


Mime
View raw message