首页 > 解决方案 > RabbitTemplate.invoke(OperationsCallBack) 在消息被取消/返回/超时时不会抛出异常

问题描述

我正在使用下面的代码在同一频道上等待确认(ack/nack/returns/timeout)。

在此处输入图像描述 在此处输入图像描述

我发送了不正确的 routingKey,所以 rabbitMq 应该按照下面的 api 文档抛出异常。但我没有从 api 中得到例外。

在此处输入图像描述

我们正在使用 waitForConfirmsOrDie 超时作为(60 秒)如果我对 api 的期望不正确,有人可以提出建议。

标签: rabbitmqamqpspring-amqp

解决方案


它不直观,但返回的消息不会生成 nack;返回消息后收到肯定的 ack。Nacks 仅由代理错误或具有大小限制且溢出行为设置为reject-publish.

https://www.rabbitmq.com/confirms.html

对于不可路由的消息,一旦交换验证消息不会路由到任何队列(返回队列的空列表),代理将发出确认。如果消息也是强制发布的,basic.return 会在 basic.ack 之前发送给客户端。

使用correated confirms(不是简单的confirms),可以在收到ack后通过查看相关数据来检查消息是否返回。

此外,当同时启用确认和返回时,只要 CorrelationData 具有唯一的 id,就会使用返回的消息填充 CorrelationData;从 2.3 版开始,默认情况下总是如此。保证在用 ack 设置未来之前设置返回消息。


推荐阅读