简体   繁体   中英

Spring integration RabbitMQ - Listener with retry

Below is my declarative configuration inside xml file for rabbitmq listener. Retry with advic chain doesnot seem to be happening.DLQMessageRecoverer class is throwing RabbitmqRejectAndDontRequeue exception. It doesnot seem to be calling it either.

<bean id="retryAdvice" class="org.springframework.amqp.rabbit.config.StatefulRetryOperationsInterceptorFactoryBean">
    <property name="messageRecoverer" ref="dlqMessageRecoverer"/>
    <!--<property name="messageRecoverer" ref="errorMessageRecoverer"/>-->
    <property name="retryOperations" ref="retryTemplate" />
</bean>

<bean id="dlqMessageRecoverer" class="com.prosper.phlconsumer.service.error.DLQMessageRecoverer" />

<bean id="retryTemplate" class="org.springframework.retry.support.RetryTemplate">
    <property name="backOffPolicy">
        <bean class="org.springframework.retry.backoff.ExponentialBackOffPolicy">
            <property name="initialInterval" value="500000" />
            <property name="maxInterval" value="12000000" />
            <property name="multiplier" value="2" />
        </bean>
    </property>
    <property name="retryPolicy">
        <bean class="org.springframework.retry.policy.SimpleRetryPolicy">
            <property name="maxAttempts" value="2" />
        </bean>
    </property>
</bean>


<rabbit:listener-container id="messageListenerContainer"
        connection-factory="connectionFactory" concurrency="1" acknowledge="auto" advice-chain="retryAdvice" >
    <rabbit:listener ref="listingsMessageListener" queue-names="${prosper.listing.phl.queue}" />
    <rabbit:listener ref="prospectsMessageListener" queue-names="${prosper.prospect.phl.queue}" />
</rabbit:listener-container>

public class DLQMessageRecoverer implements MessageRecoverer { 

     @Override public void recover(Message message, Throwable cause) { 
         message.getMessageProperties()
                .setHeader("error",cause.getMessage()); 
         throw new AmqpRejectAndDontRequeueException(cause); 
     } 

} 

I think you should set spring.rabbitmq.listener.retry.enabled property true . By default RabbitMQ doesn't retry a failed message (assuming fail is on the consumer side).

Also AmqpRejectAndDontRequeueException is preventing your message from being requeued.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM