2015-10-17 706 views
1

下面是我在用于rabbitmq监听器的xml文件中的声明性配置。用advic链重试似乎没有发生.DLQMessageRecoverer类抛出RabbitmqRejectAndDontRequeue异常。它似乎也没有调用它。Spring集成RabbitMQ - 重试的监听器

<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); 
    } 

} 
+0

添加到您的问题,编辑它。 – Berriel

回答

0

我想你应该设置spring.rabbitmq.listener.retry.enabled属性true。默认情况下,RabbitMQ不会重试失败的消息(假设客户端失败)。

另外AmqpRejectAndDontRequeueException正在阻止您的消息被重新排序。