I'm trying to find the correct configuration for our first JMS setup, using JTA transactions for our consumer. I am unable to get redelivery (on RuntimeException) working, when using JTA. Using non-XA config works however.

Doing a bit (understatement...) of digging, I have concluded that TransactionContext.rollback(Xid) is properly invoked and the rollback command has been sent to the broker. However, after that has been done, the synchronization registered in org.apache.activemq.ActiveMQMessageConsumer.close() is invoking doClose(), which in turn calls dispose() and then - because !session.getTransacted() - deliverAcks() which I suppose is why redelivery does not work.

But why does this happen???
Should session.getTransacted() really be false during rollback...?

Snippets from my Spring config:

<bean id="jmsXaConnectionFactory" class="org.apache.activemq.pool.XaPooledConnectionFactory" destroy-method="stop">
    <property name="connectionFactory">
<bean class="org.apache.activemq.ActiveMQXAConnectionFactory" p:brokerURL="${brokerUrl}" />
    </property>
    <property name="transactionManager" ref="jtaTransactionManager" />
  </bean>

<bean class="org.springframework.jms.listener.DefaultMessageListenerContainer" p:connectionFactory-ref="jmsXaConnectionFactory"
        p:transactionManager-ref="transactionManager"
        p:destination="..." p:messageListener="..." />

I'm using ActiveMQ 5.6.0

--

  </Mattias>

Reply via email to