Hi James,

By using singular transactions rather than distributed transactions (XA),
each resource involved is responsible for managing its own transaction, i.e.
the JMS session and the JDBC DataSource will run separate transactions.

Camel has a concept called "Unit of Work" that is used to synchronise
transactions, or quasi-transactional behaviour, across several endpoints in
a route. An example of a "quasi-transactional" action is found in the File
consumer endpoint, where the file only will be moved to the "done" directory
if the route hasn't failed. Otherwise it will be moved to the "failed"
directory.

In the scenario that Christian proposes, the JMS consumer will begin a
transaction and will wait till the Exchange is done. At that point, it will
decide whether to commit or rollback the transaction depending on if there's
an Exception set or not in the Exchange. This way, you don't get full XA
behaviour, but you get something pretty close. There's still a risk of JMS
and JDBC becoming falling out of sync if Camel crashes after JDBC commits
but before the JMS endpoint is notified of the DONE exchange and commits the
local transaction there.

To use this approach, you want to set transacted=true at the JMS consumer,
so that the JMS endpoint will manage its transaction.

On the other hand, XA is a different story. With XA, you don't want Camel to
manage the transaction (you set transacted=false on the endpoint), because
the XAResource will enlist itself in the transaction automatically. If you
set transacted=true with XA, you'll begin to see exceptions due to the JMS
XAResouce being enlisted twice.

While I worked at FuseSource, Charles Moulliard and I created examples
showing both:
a) XA Transactions involving JMS and JDBC
b) JMS + JDBC local transactions

You can find the source code here: [1] and [2]. Here is a video with the
demo: [3], and the full webinar is split in two parts: [4] and [5].

Hope that helps!
Raúl.

---
Raúl Kripalani
Enterprise Architect, Program Manager, Open Source Integration specialist
http://about.me/raulkripalani | http://www.linkedin.com/in/raulkripalani
http://blog.raulkr.net | twitter: @raulvk

[1] https://github.com/FuseByExample/camel-persistence-part1
[2] https://github.com/FuseByExample/camel-persistence-part2
[3] http://www.youtube.com/watch?v=Fj9ECUW9nxc
[4]
http://fusesource.com/require_registration_for?url=http://streaming.progress.com/fusesource/102711_FUSE_part_1_CM/index.htm
[5]
http://fusesource.com/require_registration_for?url=http://streaming.progress.com/fusesource/112211_FUSE_Part_2_CM/index.htm



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

Reply via email to