I am having an issue with JMS queues and transactions. 

I have the following route:

from("queue:incomingqueue")
        .process(getSomeTranslationProcessor())
        .process(getMyPersistanceProcessor())
        .process(getSomeOtherTransformerProcessor())
        .to("queue:outgoingqueue");

The first and third processor just do some simple transformation on the
exchange.  The middle processor (myPersistanceProcessor) is the key piece. 

It is a processor that sends part of the exchange to another queue and
requests a reply back.  It uses a ProducerTemplate and looks like:

Long recordDBId = (Long)producer.sendBody("queue:persistancequeue",
ExchangePattern.InOut, objectToPersist);

It is a synchronous process - so the myPersistanceProcessor will wait for a
reply back before continuing.

Now - the issue I have is this.  If that InOut part of the route fails for
any reason (such as a time out, returns an error etc).  I want to
essentially NOT acknowledge the message from the original incoming JMS queue
(meaning it will go back on the front of the queue).


I know that if you just do a "queue:incomingqueue?transacted=true" - it will
put the message back on the queue if the exchange failed.  However If you
add "transacted=true" to the incoming queue in my route - it will never send
the message for the RequestReply part.  

Based on the documentation - that is because we must first commit the
transaction and then start another.  However there is mention of the value
"transactedInOut=true" which seems to imply it will create a transaction
that wraps the WHOLE process (including the requestreply).

In practice - using "transactedInOut=true" means that if the
producer.sendBody() timesout, it sends an eviction notice for that message -
but the original exchange does NOT get put back on the incoming queue.  In
fact it disappears altogether.  The Camel JMX bean does not record it as a
"Failed Exchange" - even through the log message says it was a failed
exchange.  The exposed Camel JMX thinks it was a successful exchange.

Is that how the "transactedInOut=true" is supposed to operate?  Is there any
way to tell the incoming queue that we did NOT process the message and have
it put back there if it failed?  Is there an error route that would put the
original message back on the queue?  Or is that where using the:

onException(Exception.class)
.maximumRedeliveries(-1)

comes into play - as that will cause it to just be re-tried constantly?

Thanks for any help you can offer!
-- 
View this message in context: 
http://old.nabble.com/JMS-Transactions-and-RequestReply---transactedInOut%3Dtrue-not-working--tp26138285p26138285.html
Sent from the Camel - Users mailing list archive at Nabble.com.

Reply via email to