You could use a "normal" JMS transaction to read your JMS message and write the response back into a queue (in the same transaction of course). Make sure your database inserts/updates are committed all together. If your database insert/update fails, the JMS transaction manager will rollback your transaction and the JMS message will be put back into your queue. If the insert/update was successful, the JMS transaction will be comitted which means the message you read will be deleted and the response message will be committed into the response queue.
There is a potential risks: - The database insert/update was successful and before you could commit the JMS transaction, the JMS broker went down. After restarting the broker, the message will be redelivered because of the missing commit. May be this is not a problem, if your database access is idempotent (if you execute an update or a stored procedure which checks for duplicated before it executes the insert or ...). May be this link is also helpful for your: http://www.javaworld.com/javaworld/jw-01-2009/jw-01-spring-transactions.html Best, Christian On Fri, Sep 14, 2012 at 3:28 PM, James Carman <ja...@carmanconsulting.com>wrote: > Christian, > > Also, what we're looking to do is use non-XA WebSphere MQ connections. > So, we need to figure out how to configure this stuff using non-XA > JMS, but still have it behave correctly. We are using DBCP's > "managed" pool support for the data sources. We believe that's > working okay. > > Thanks, > > James > > On Thu, Sep 13, 2012 at 6:11 PM, Christian Müller > <christian.muel...@gmail.com> wrote: > > May be these examples are useful for you: > > https://github.com/muellerc/camel-in-transaction > > > > Best, > > Christian > > > > On Thu, Sep 13, 2012 at 4:33 PM, James Carman < > ja...@carmanconsulting.com>wrote: > > > >> Claus, > >> > >> Is there any guidance on how to set up XA correctly? We're having a > >> really rough time getting Websphere MQ and SQL Server connections to > >> work together in an XA fashion. > >> > >> Thanks, > >> > >> james > >> > >> On Thu, Sep 13, 2012 at 10:17 AM, Claus Ibsen <claus.ib...@gmail.com> > >> wrote: > >> > For that you would need XA when you have 2+ resources participating in > >> > the same transaction. > >> > It can be tricky to setup. You would need to use the JTA transaction > >> > manager from WebSphere etc which supports XA. > >> > > >> > Make sure the MQ connection factory you refer to is the XA one. > >> > > >> > On Thu, Sep 13, 2012 at 2:59 PM, Caa_man <c...@acs-it.ru> wrote: > >> >> 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. > >> > > >> > > >> > > >> > -- > >> > Claus Ibsen > >> > ----------------- > >> > FuseSource > >> > Email: cib...@fusesource.com > >> > Web: http://fusesource.com > >> > Twitter: davsclaus, fusenews > >> > Blog: http://davsclaus.com > >> > Author of Camel in Action: http://www.manning.com/ibsen > >> > > > > > > > > -- > --