2017-04-18 21 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> 

最初に交換機にメッセージを発行したとき、リスナーはnull ID例外で失敗しました。私も悪いメッセージを持っているキューをパージしました。私はサービスを開始するたびに、失敗したメッセージ処理を再試行し、RetryCacheCapacityExceeded例外が発生するまで継続的に失敗します。

失敗したメッセージはどこかにキャッシュされていますか?それをクリアする方法はありますか? また、私のretrytemplateが5秒の間隔で3回の再試行を提案しても、なぜ再試行を続けるのですか?

答えて

1

ステートフルリトライを使用すると、各メッセージIDの再試行状態はキャッシュに保持されます(したがって、いつ停止するか分かります)。

IDがない場合は、MissingMessageIdAdviceをアドバイスチェーン(再試行インターセプタの前)に追加しないと、IDなしのメッセージに対して1回の再試行が許可されない限り、メッセージは失敗し、配信され続けます。

関連する問題