You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@activemq.apache.org by Mattias Jiderhamn <ma...@expertsystems.se> on 2012/11/20 12:41:24 UTC

Selectively redeliver?

Here is what I want to do:
In my JMS listener, I want to have a(n inner) transaction that performs 
work, and that may end with an exception and be rolled back.
Depending on the type of exception that caused the (inner) tx to roll 
back, I either want redelivery or ack the message as having been 
received properly.

I tried implementing this with a JTA aware ActiveMQ listener 
(XaPooledConnectionFactory), an inner transaction with propagation 
REQUIRES_NEW, and the listener catching exceptions and either 
(re)throwing RuntimeException to cause redelivery or return to cause 
ack. As of parallell thread it turned out there was a bug with JTA tx 
suspend/resume in ActiveMQ (https://issues.apache.org/jira/browse/AMQ-3059).

My question is what the most proper solution would be instead? I'm a JMS 
newbie, but AFAI can see I have at least two options:
1: Use transactional but non-XA listener and still throw 
RuntimeException for redelivery
2: Instead of throwing a RuntimeException to request redelivery, 
implement listener to explicitly request redelivery from the JMS session

Do I have more options?
I haven't tested if option 2 works with XA and suspend/resume; does 
anyone know? Or should I simply use a non-transactional listener...? 
(Would that be better than option 1?)

Thanks in advance,

  </Mattias>