Hello all,

I'm learning Apache Camel and several questions appeared regarding transactions 
and delivery guaranties.
Could you help with them please.


1) Route Ex.:

from ( "jms:queue:inputQueue" )
    . split ( splitter )
.... any other transformations
    . to ( "jms:queue:outputQueue" ) ;

I.e. there is input JMS queue, from which messages are taken, than each message 
is spllitted on several (possibly other transformations) and all are sent to 
output queue. I.e. 1 input message is transformed to multiple in output queue.

Is my understanding correct, that if both queues are configured to use 
transactions, whole route will be done in one transaction. And so message from 
"inputQueue" will be removed only after all messages are successfully written 
to "outputQueue"?
And accordingly(1 input message is spllited on 10), if several messages are 
successfully written to output queue, but procession of one failed(6 correctly 
processed, but 7th failed) - input message will be left in "inputQueue" and no 
new messages will be added to "outputQueue" (i.e. all 6 successful will be 
removed). Is that correct?
So one transaction for removing message from input queue and writing several to 
output queue, Correct?



2) Example with database and file

1. Read file
--  start xa tx
2.1. Split file
2.2. Send parts to JMS
2.3. Write record to DB (file processed + number of parts + other metadata)
-- commit/rollback xa tx

3. Other steps, which will be able to retrieve data from db, to get info about 
file and its metadata. 
There might be another steps which also will be able to update this record with 
their own data.
So in general, db will be used as persistent storage of each procession state. 


As I understood, that's possible to do with </transacted>. i.e. like

from("file:")
   .transacted()
   .split()
   .beanRef("dbRepo", "writeToDb")
   .to("jms:queue")

so transaction will be started right before split and will be committed after 
placing into the queue.
I.e. split, write to db and write to queue will be in one tx, and if anything 
fails, everything will be rolledback - no new records in db, no messages in 
queue.
Is that correct and is such behavior possbile?
But to work that properly, platform transaction manager and transaction manager 
must be configured correctly to support XA transactions.
And is that a good idea, to store state of procession? Or is that better to be 
stateless and just build idempotent consumers(to not to process same message 
twice). But to do that, info about what was processed still need to be stored 
somewhere (db, kafka, etc), so looks like just changing the storage.

Appreciate any input.
Thanks in advance!


-- 
Maxim

Reply via email to