Java Spring RabbitMQ-消息重新请求限制
为我的消息传递应用程序使用Spring boot和Spring starter amqp。我的问题是: 第一个问题:我只想重新查询我的消息5次,然后如果发生业务异常,消息应该从队列中出来(这里我只关注业务异常) 第二个问题:如果第一个用例是可能的,我们是否可以根据尝试增加重新查询的时间。假设在第一次尝试中发生业务异常,它应该立即重新排队,但在第二次尝试中,它应该在2分钟后重新排队,然后4分钟,然后6分钟,然后8分钟,然后10分钟,类似时间将根据尝试增加 感谢对于这种简单的情况(尝试之间的固定延迟),您可以将队列配置为通过死信交换发送被拒绝的消息,并抛出Java Spring RabbitMQ-消息重新请求限制,java,spring,spring-boot,spring-amqp,spring-rabbit,Java,Spring,Spring Boot,Spring Amqp,Spring Rabbit,为我的消息传递应用程序使用Spring boot和Spring starter amqp。我的问题是: 第一个问题:我只想重新查询我的消息5次,然后如果发生业务异常,消息应该从队列中出来(这里我只关注业务异常) 第二个问题:如果第一个用例是可能的,我们是否可以根据尝试增加重新查询的时间。假设在第一次尝试中发生业务异常,它应该立即重新排队,但在第二次尝试中,它应该在2分钟后重新排队,然后4分钟,然后6分钟,然后8分钟,然后10分钟,类似时间将根据尝试增加 感谢对于这种简单的情况(尝试之间的固定延迟
AmqpRejectAndDontRequeueException
将队列绑定到死信交换,并在该队列上设置生存时间(ttl),并使用原始队列绑定到的死信交换对其进行配置。该消息将在TTL过期后重新发出
您需要检查x-death
标题,以确定消息在循环中经过了多少次。重试次数用尽后,立即抛出KnowledgeAmqpException
以丢弃该消息
对于可变延迟,您必须自己将消息重新发布到延迟的消息交换(有一个代理插件用于此),每次重试的延迟都会增加
另请参见。不想为此使用代理插件;我们可以使用自定义拦截器吗?不;对于可变延迟,您必须使用延迟消息交换插件,或者自己将消息发布到DLQ,而不是拒绝它。您可以使用
rabbitemplate.send(message)
)和messageProperties.setExpiration()请参见-Spring AMQP将为您映射过期属性。如果我使用rabbitmplate.send(message))和messageProperties.setExpiration()发送消息对于延迟消息超时。如何计算由于消费者的业务异常而导致的失败尝试的数量您需要设置自定义标题,例如“deliveryAttempts”。第一次添加它,设置为1,然后递增。