2017-04-18 220 views
1

这在RabbitMQ的配置,我有:的RabbitMQ:失败消息被重新处理以无限循环

<rabbit:admin connection-factory="rmqConnectionFactory"/> 

<bean id="**retryAdvice**" class="org.springframework.amqp.rabbit.config.StatefulRetryOperationsInterceptorFactoryBean"> 
    <property name="retryOperations" ref="retryTemplate"/> 
</bean> 

<bean id="**retryTemplate**" class="org.springframework.retry.support.RetryTemplate"> 
    <property name="retryPolicy" ref="simpleRetryPolicy"/> 
    <property name="backOffPolicy"> 
     <bean class="org.springframework.retry.backoff.FixedBackOffPolicy"> 
      <property name="backOffPeriod" value="5000"/> 
     </bean> 
    </property> 
    <property name="retryContextCache" ref="retryContext"/> 
</bean> 

<bean id="**retryContext**" class="org.springframework.retry.policy.MapRetryContextCache"/> 

<bean id="**simpleRetryPolicy**" class="org.springframework.retry.policy.SimpleRetryPolicy"> 
    <property name="maxAttempts" value="3"/> 
</bean> 

<!-- Spring AMQP Template --> 
<bean id="**rabbitTemplate**" class="org.springframework.amqp.rabbit.core.RabbitTemplate"> 
    <property name="connectionFactory" ref="rmqConnectionFactory"/> 
    <property name="messageConverter" ref="stdJsonMessageConverter"/> 
</bean> 

<bean id="**stdJsonMessageConverter**" class="org.springframework.amqp.support.converter.JsonMessageConverter"> 
    <property name="createMessageIds" value="true"/> 
</bean> 

而我的队列被配置如下:

<rabbit:queue name="${queue}" durable="true"> 
    <rabbit:queue-arguments> 
     <entry key="x-ha-policy" value="all"/> 
    </rabbit:queue-arguments> 
</rabbit:queue> 

<rabbit:direct-exchange name="${exchange}"> 
    <rabbit:bindings> 
     <rabbit:binding queue="${queue}" key="${routingKey}"/> 
    </rabbit:bindings> 
</rabbit:direct-exchange> 

当我第一次在交换机上发布消息时,监听器失败,出现空ID异常。我清除了有错误信息的队列。尽管如此,每次我开始我的服务时,失败的消息处理都会重试,并且会持续失败,直到出现RetryCacheCapacityExceeded异常。

我的失败消息是否被缓存在某处?有没有办法清除它? 此外,即使我的retrytemplate以5秒的间隔建议重新尝试3次,为什么重试仍会继续?

回答

1

当您使用有状态重试时,每个消息ID的重试状态保存在缓存中(所以我们知道何时停止)。

如果没有ID,该消息将失败(并保持被送到),除非你添加一个MissingMessageIdAdvice的意见链(重试前拦截器),这将使得1重试与没有ID的消息。