2017-01-07 34 views
0

使用Spring-boot和Spring-starter-amqp作为我的消息传递应用程序。我的问题场景是这样的:Spring RabbitMQ - Message Requeue limit

第一个问题:我想重发我的消息只有5次,然后消息应该从队列中发出,如果发生业务异常(这里我只关注业务异常)。

第二个问题:如果第一个用例是可能的,我们可以通过某种方式增加尝试次数。假设在第一次尝试时发生业务异常,它应该立即要求,但在第二次尝试中,应该在2分钟后然后4分钟,然后6分钟,然后8分钟,然后10分钟,如时间将根据尝试增加。

感谢

回答

0

对于简单的情况下(尝试之间固定延迟),您可以配置队列发送拒绝的邮件一纸空文交流,并抛出AmqpRejectAndDontRequeueException

将队列绑定到死信交换,并在该队列上设置一个生存时间(ttl),并使用原始队列绑定到的死信交换进行配置。该消息将在TTL到期后重新发送。

您需要检查x-death标头以确定消息已遍历循环的次数。重试完毕后,抛出一个ImmediateAcknowledgeAmqpException放弃该消息。

对于可变延迟,您必须自己重新发布消息,进行延迟消息交换(有一个代理插件),每次重试延迟都会增加。

另请参阅this answer

+0

不想使用代理插件;我们可以使用自定义拦截器来做到这一点吗? – blackOcean

+0

否;对于变量延迟,您将不得不使用延迟的消息交换插件或将消息自己发布到DLQ你可以使用带有messageProperties.setExpiration()的'RabbitTemplate.send(message)''参见[这里](https://www.rabbitmq.com/ttl.html) - Spring AMQP将映射到期 –

+0

如果我使用RabbitTemplate.send(message)发送消息)和messageProperties.setExpiration()来延迟消息超时。我如何计算由于消费者的业务异常导致的失败尝试的次数 – blackOcean