Java Rabbitmq:在无限循环中重新处理失败的消息

Java Rabbitmq:在无限循环中重新处理失败的消息,java,spring,rabbitmq,spring-rabbit,Java,Spring,Rabbitmq,Spring Rabbit,这是我拥有的rabbitmq配置: <rabbit:admin connection-factory="rmqConnectionFactory"/> <bean id="**retryAdvice**" class="org.springframework.amqp.rabbit.config.StatefulRetryOperationsInterceptorFactoryBean"> <property name="retryOperations"

这是我拥有的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: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: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>

当我第一次在exchange上发布消息时,侦听器失败,出现空ID异常。我清除了包含坏消息的队列。尽管如此,每次我启动服务时,都会重试失败的消息处理,并持续失败,直到出现RetryCacheCapacityExceed异常

<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>
我的失败消息是否已缓存在某个位置?有没有办法澄清这一点?
此外,为什么即使我的retrytemplate建议以5秒的间隔重新尝试3次,重试仍会继续?

当您使用有状态重试时,每个消息id的重试状态都保存在缓存中(因此我们知道何时停止)

<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>
如果没有ID,消息将失败(并继续传递),除非您将
MissingMessageIdAdvice
添加到通知链(在重试侦听器之前),这将允许对没有ID的消息进行1次重试

<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>