I'm having a problem with message redelivery.

I'm using:

ActiveMQ 5.3.0
Spring 2.5.6
Spring Integration 1.0
Atomikos 3.5.9

If I send a 'broken' message to my queue, the transaction rolls back
correctly but it NEVER gets redelivered even if I restart both the client
(application) and the broker. Subsequently valid messages get delivered just
fine but it seems that this broken message never gets redelivered. The
message shows as 'redelivered' in the activemq web admin even though my logs
only show it having been delivered one time and being rolled back.

I'm using the default activemq broker configuration (out of the box) with
the following spring configuration:

<bean id="queueConnectionFactoryBean"
class="org.springframework.jms.connection.SingleConnectionFactory"
destroy-method="destroy">
    <constructor-arg>
      <bean class="com.atomikos.jms.QueueConnectionFactoryBean"
init-method="init">
        <property name="xaQueueConnectionFactory"
ref="queueConnectionFactoryXa"/>
      </bean>
    </constructor-arg>
    <property name="reconnectOnException" value="true"/>
  </bean>
  
  <bean id="queueConnectionFactoryXa"
class="org.apache.activemq.ActiveMQXAConnectionFactory">
    <property name="brokerURL" value="${activemq.url}"/>
    <!--  Set prefetch to 1 to prevent message rollback from preventing
message redelivery.
        See http://activemq.apache.org/what-is-the-prefetch-limit-for.html
for more information 
    -->
    <property name="prefetchPolicy">
      <bean class="org.apache.activemq.ActiveMQPrefetchPolicy">
        <property name="queuePrefetch" value="0"/>
      </bean>
    </property>
    <property name="redeliveryPolicy">
      <bean class="org.apache.activemq.RedeliveryPolicy">
        <property name="initialRedeliveryDelay" value="1000"/>
        <property name="maximumRedeliveries" value="10"/>
        <property name="useExponentialBackOff" value="false"/>
      </bean>
    </property>
  </bean>

  <bean id="gatewayMessageListenerContainer"
class="org.springframework.jms.listener.DefaultMessageListenerContainer"
        depends-on="transactionManager">
      <property name="connectionFactory" ref="queueConnectionFactoryBean"/>
      <property name="transactionManager" ref="transactionManager"/>
      <property name="destination" ref="gatewayMessageDestination"/>
      <property name="sessionTransacted" value="true"/>
      <property name="maxConcurrentConsumers" value="5"/>
      <property name="concurrentConsumers" value="1"/>
      <property name="receiveTimeout" value="5000"/>
      <property name="recoveryInterval" value="60000"/>
      <property name="autoStartup" value="true"/>
  </bean>
  
  <!-- Inbound Gateway Channel adapter -->
  <jms:message-driven-channel-adapter id="gatewayMessageAdapter" 
                                      channel="gatewayMessageChannel" 
                                     
container="gatewayMessageListenerContainer"/>

I see the message rollback in the application logs:

2009-12-14 11:41:11,236 DEBUG
[org.springframework.jms.listener.DefaultMessageListenerContainer][AbstractPollingMessageListenerContainer.java:328]
Rolling back transaction because of listener exception thrown:
org.springframework.integration.message.MessageDeliveryException: failed to
send Message to request channel
2009-12-14 11:41:11,237 WARN 
[org.springframework.jms.listener.DefaultMessageListenerContainer][AbstractMessageListenerContainer.java:646]
Execution of JMS message listener failed
org.springframework.integration.message.MessageDeliveryException: failed to
send Message to request channel
        at
org.springframework.integration.jms.ChannelPublishingJmsMessageListener.onMessage(ChannelPublishingJmsMessageListener.java:205)
        at
org.springframework.jms.listener.AbstractMessageListenerContainer.doInvokeListener(AbstractMessageListenerContainer.java:518)
        at
org.springframework.jms.listener.AbstractMessageListenerContainer.invokeListener(AbstractMessageListenerContainer.java:479)
        at
org.springframework.jms.listener.AbstractMessageListenerContainer.doExecuteListener(AbstractMessageListenerContainer.java:451)
        at
org.springframework.jms.listener.AbstractPollingMessageListenerContainer.doReceiveAndExecute(AbstractPollingMessageListenerContainer.java:323)
        at
org.springframework.jms.listener.AbstractPollingMessageListenerContainer.receiveAndExecute(AbstractPollingMessageListenerContainer.java:241)
        at
org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.invokeListener(DefaultMessageListenerContainer.java:982)
        at
org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.executeOngoingLoop(DefaultMessageListenerContainer.java:974)
        at
org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.run(DefaultMessageListenerContainer.java:876)
        at java.lang.Thread.run(Thread.java:619)
2009-12-14 11:41:11,238 DEBUG
[org.springframework.transaction.jta.JtaTransactionManager][AbstractPlatformTransactionManager.java:682]
Transactional code has requested rollback
2009-12-14 11:41:11,238 DEBUG
[org.springframework.transaction.jta.JtaTransactionManager][AbstractPlatformTransactionManager.java:821]
Initiating transaction rollback
2009-12-14 11:41:11,240 DEBUG
[org.apache.activemq.TransactionContext][TransactionContext.java:416]
Rollback: das_eai_web_tm0009600001das_eai_web_tm96


And in the ActiveMQ log:

2009-12-14 11:41:11,241 | DEBUG | XA Transaction rollback:
XID:1096044365:6461735f6561695f7765625f746d30303039363030303031:6461735f6561695f7765625f746d3936
| org.apache.activemq.transaction.XATransaction | ActiveMQ Transport:
tcp:///127.0.0.1:46357

One odd thing I notice is that the InFlight value is negative...and
decrements by 1 everytime one of these bogus messages rolls back.

Anyone have any ideas what is wrong with my configuration? Why won't these
rolled back messages redeliver?


-- 
View this message in context: 
http://old.nabble.com/Rolled-back-messages-never-get-redelivered-tp26779979p26779979.html
Sent from the ActiveMQ - User mailing list archive at Nabble.com.

Reply via email to