Hello!

I`d like to built a camel route with this logic:

  - receive message with XML from WebSphere queue (camel "from")
  - begin transaction (distributed transaction via "transacted")
  - parse xml (camel "process")
  - save income message to Oracle DB (camel "process")
  - create reply message (camel "process")
  - send reply message to WebSphere queue (camel "to" with
uri="bean:mqRemoteSender?method=remoteRoute", where I manually send
camel-message body to MQQueue object)

i.e. I`d like to do "INSERT" request to DB and send message in single
transaction.

I use:

1) JmsComponent:
  <bean id="wmq" class="org.apache.camel.component.jms.JmsComponent">
        <property name="connectionFactory" ref="wmqConnectionFactory"/>
        <property name="concurrentConsumers" value="5"/>
        <property name="maxConcurrentConsumers" value="5"/>
        <property name="transactionManager" ref="transactionManager"/>
        <property name="transacted" value="true"/>
  </bean>
  <bean id="wmqConnectionFactory"
class="com.ibm.mq.jms.MQConnectionFactory">
        <property name="transportType" value="1"/>
        <property name="hostName" value="${HostName}"/>
        <property name="port">
             <bean id="portValue" class="java.lang.Integer">
                 <constructor-arg value="${PortValue}"/>
             </bean>
        </property>
        <property name="queueManager" value="${ManagerName}"/>
        <property name="channel" value="${ConnectionChannel}"/>
  </bean>
2) Transaction policy:
   <bean id="required"
class="org.apache.camel.spring.spi.SpringTransactionPolicy">
        <property name="transactionManager" ref="transactionManager"/>
        <property name="propagationBehaviorName"
value="PROPAGATION_REQUIRED"/>
   </bean>
3)  Transaction manager:
    <bean id="transactionManager"
class="org.springframework.transaction.jta.JtaTransactionManager"/>
4)  Annotation driver:
   <tx:annotation-driven transaction-manager="transactionManager" />
5) Process with DB save requests:

    private org.springframework.orm.jpa.JpaTemplate jtaTemplate;

    @Transactional(propagation = Propagation.REQUIRED)
    @Override
    public void process(Exchange exchange) throws Exception {
      SomeEntityClass entityObject = new SomeEntityClass();
     ...
      jtaTemplate.persist(entityObject);
      jtaTemplate.flush();
   }
6) persistence-unit:
        <persistence-unit name="jpaName" transaction-type="JTA">
        <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
        <jta-data-source>jdbc/applicationConnection</jta-data-source>
        <mapping-file>META-INF/orm.xml</mapping-file>
                <class>SomeEntityClass</class>
                <properties>
                        <property name="eclipselink.target-server" value="OC4J" 
/>
                        <property name="eclipselink.target-database" 
value="Oracle" />
                        <property name="eclipselink.weaving" value="false" />
                        <property name="eclipselink.logging.level" value="FINE" 
/>
                        <property name="eclipselink.cache.shared.default" 
value="false"/>
            <property name="eclipselink.jdbc.batch-writing"
value="Oracle-JDBC" />
            <property name="eclipselink.jdbc.fetch-size" value="1000" />
                </properties>
        </persistence-unit>

But there is no distributed transaction. 
Oracle-db-transaction and wmq-send-transaction are independent from
jms-receive-transaction.
Whats wrong?



--
View this message in context: 
http://camel.465427.n5.nabble.com/Distributed-transaction-in-camel-route-tp5719279.html
Sent from the Camel - Users mailing list archive at Nabble.com.

Reply via email to