我定义了一个队列blah.queue,并为其定义了死信路由键。 但是,当我收到带有失败的异常失败消息时,该消息将重新排队并重新尝试(在无限循环中)。 我希望在重试3次之后,该消息应该与死信路由键一起放在交换机上。 但这似乎没有发生。

我有以下设置:

    <rabbit:queue name="blah.queue" auto-delete="false" durable="true">
    <rabbit:queue-arguments>
        <entry key="x-dead-letter-exchange" value="" />
        <entry key="x-dead-letter-routing-key" value="blah.queue.dlq.route" />
        <entry key="x-ha-policy" value="all" />
    </rabbit:queue-arguments>
</rabbit:queue>
<rabbit:direct-exchange name="${rabbit.idesk.exchange}">
    <rabbit:bindings>
        <rabbit:binding queue="blah.queue" key="blah.route" />
    </rabbit:bindings>
</rabbit:direct-exchange>

<bean id="myConsumer" class="com.ankit.CustomConsumer" />

<bean id="myConsumerMessageListenerAdapter" class="org.springframework.amqp.rabbit.listener.adapter.MessageListenerAdapter">
    <constructor-arg ref="myConsumer" />
    <constructor-arg ref="myMessageConverter" />
</bean>

<bean id="myConsumerMessageListenerContainer" class="org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer">
    <property name="queueNames" value="blah.queue" />
    <property name="connectionFactory" ref="queueConnectionFactory" />
    <property name="messageListener" ref="myConsumerMessageListenerAdapter" />
    <property name="errorHandler" ref="loggingErrorHandler" />
    <property name="adviceChain">
        <list>
            <ref bean="retryAdvice" />
        </list>
    </property>
</bean>

<bean id="loggingErrorHandler" class="org.springframework.scheduling.support.TaskUtils.LoggingErrorHandler" />

<bean id="myMessageConverter"
    class="org.springframework.amqp.support.converter.JsonMessageConverter">
    <property name="classMapper">
        <bean class="com.ankit.queue.mapper.NamedClassMapper">
            <constructor-arg
                value="com.ankit.dto.EventDTO" />
        </bean>
    </property>
    <property name="createMessageIds" value="true" />
</bean>

<bean id="retryAdvice" class="org.springframework.amqp.rabbit.config.StatefulRetryOperationsInterceptorFactoryBean">
    <property name="messageRecoverer" ref="rejectAndDontRequeueRecoverer" />
    <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>
</bean>

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

#1楼 票数:0

您没有看到恢复器发出的WARN消息吗?

@Override
public void recover(Message message, Throwable cause) {
    if (this.logger.isWarnEnabled()) {
        this.logger.warn("Retries exhausted for message " + message, cause);
    }
    throw new ListenerExecutionFailedException("Retry Policy Exhausted",
                new AmqpRejectAndDontRequeueException(cause), message);
}

打开调试日志记录以观察重试行为。

  ask by Ankit Gupta translate from so

未解决问题?本站智能推荐:

1回复

Spring和RabbitMQ消息顺序

我正在开发一个应用程序,该应用程序接收按会话ID分组的剩余消息(会话1可以由2条消息组成,会话2可以由10条消息组成)并将它们发送到数据库。 给定会话的消息内部具有相同的会话ID。 对于给定的会话,应该将第1条消息首先发送到数据库,然后再发送2条消息,依此类推。在会话内部,顺序非常重要。
2回复

SpringBootAMQP@RabbitListener没有收到消息

我有一个Spring Boot应用程序,我正在尝试通过RabbitMQ发送和接收消息。 问题 我可以将消息成功发送到队列(即我在RabbitMQ Manager中的队列中看到它们),但是我的Receiver没有收到消息。 我有一个我从JUnit调用的RESTful端点,后者又调用Se
1回复

RabbitMQConsumer只使用发送的部分消息

我正在向RabbitMQ发送少量消息,但使用者仅消耗其中的两个。 在下面找到我的生产者和消费者的代码: 目标是按国家/地区对电话号码进行分组和计数。 我现在只是在玩RabbitMQ,没有经验,所以现在分组很愚蠢。 但问题是,为什么只收到两条消息,而不是7条? 编辑:我相信是由于这
1回复

springRabbitmq获得对扇出消息的所有回复

以下类别包含在几个消费者应用程序中: 我正在尝试向扇出交换发送消息,并接收所有答复,以了解正在运行的消费者。 我可以发送一条消息,并得到第一个这样的答复: 但是,我需要对此消息的所有回复,而不仅仅是第一条。 我需要设置一个回复侦听器,但是我不确定如何设置。
1回复

SpringIntegrationRabbitmq消息处于就绪状态

我与rabbitmq的春季集成出现了问题。 消息被发送到队列,但最终处于就绪状态,并且消息未被确认,但使用者没有得到它们。 Thx xml配置如下所示: 在服务器上重新启动时,第一个被拾取,但是在下一个调用中,消息堆积在队列中。 您知道为什么会发生这种情况吗? 谢谢丹尼尔 编
1回复

RabbitTemplate删除交换后发送失败

我有以下问题。 我正在使用spring-rabbit-2.0.5.RELEASE中的RabbitTemplate类。 并使用它向不同的交易所发送消息。 默认情况下,一切正常。 但是,当其中一个交换被删除并且要处理的消息很多时,将消息发送到现有的交换会出现问题-但不会引发任何错误-消息只是
1回复

rabbitmq使用json消息并转换为Java对象

我已经整理了一个java测试。 它将消息放入队列并将其作为字符串返回。 我想要实现的是它转换为java对象SignUpDto。 我已经尽可能地删除了代码。 问题: 如何修改下面的测试以转换为对象? SignUpClass 应用程序 - 配置类 考试
1回复

如何将错误消息移动到rabbitmq死信队列

我读了很多文档/ stackoverflow,但是当发生异常以将消息移动到死信队列时,我仍有问题。 我正在使用spring-boot这是我的配置: 死信队列: 队列名称:错误 我的交换:name:error_exchange binding:to:error,routing_key