2015-10-17 700 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正在阻止您的消息被重新排序。