我正在通过 Spring AMQP 使用 RabbitMQ 开发 Spring Boot 项目。我们希望能够在消息发布被 NACK 时测试应用程序的行为(特别是当
ack
的 PublisherConfirmCallback#confirm
参数为 false
时)。然而,我们很难在集成测试中设置此场景(即应用程序运行,而不是单元测试)。
需要明确的是,我们正在围绕发布者确认进行测试,而不是消费者确认。
我们知道您可以使用 RabbitTemplate 的
execute
方法访问通道,但我们的 RabbitMQ 自动确认,因此在执行通道回调时消息已经消失。我们认为我们可以在运行时禁用自动确认(以免中断测试套件)或简单地阻塞通道并在测试中手动接收消息,但我们无法弄清楚如何做其中任何一个。但实际上,任何在测试期间引起 NACK 的方法都很棒。
tl;dr 如何从客户端代码中确认消息
向不存在的交易所发布消息将导致发布者确认回调收到 nack!
首先,您必须关闭自动确认。打开该功能后,将无法取消消息。
之后,您的测试设置应该包括一个消息消费者,该消息消费者专门编码为在您想要的时候做您想做的事情...不要使用您的真实代码来测试 nack 处理。设置一个只执行 nack 的消费者...或者一个知道何时收到某些消息的消费者,它应该 nack
我发现在发布消息时测试代理 nack 的最佳方法是设置队列最大长度并将溢出策略设置为
reject-publish
。一旦达到最大长度限制,这会导致代理nack
任何消息。
参见兔子文档。
my-pol 策略确保两个消息队列包含不超过 2 条消息,并且只要队列包含 2 条消息并且启用了发布者确认,所有其他发布都会发送 basic.nack 响应。
我可以在管理控制台中轻松完成此操作:
注意:从 RabbitMQ 3.13.6 开始,这适用于经典队列和仲裁队列。