如何强制 RabbitMQ 代理 NACK 消息进行测试?

问题描述 投票:0回答:3

我正在通过 Spring AMQP 使用 RabbitMQ 开发 Spring Boot 项目。我们希望能够在消息发布被 NACK 时测试应用程序的行为(特别是当

ack
PublisherConfirmCallback#confirm
参数为
false
时)。然而,我们很难在集成测试中设置此场景(即应用程序运行,而不是单元测试)。

需要明确的是,我们正在围绕发布者确认进行测试,而不是消费者确认。

我们知道您可以使用 RabbitTemplate 的

execute
方法访问通道,但我们的 RabbitMQ 自动确认,因此在执行通道回调时消息已经消失。我们认为我们可以在运行时禁用自动确认(以免中断测试套件)或简单地阻塞通道并在测试中手动接收消息,但我们无法弄清楚如何做其中任何一个。但实际上,任何在测试期间引起 NACK 的方法都很棒。

tl;dr 如何从客户端代码中确认消息

java spring rabbitmq amqp
3个回答
1
投票

向不存在的交易所发布消息将导致发布者确认回调收到 nack!


0
投票

首先,您必须关闭自动确认。打开该功能后,将无法取消消息。

之后,您的测试设置应该包括一个消息消费者,该消息消费者专门编码为在您想要的时候做您想做的事情...不要使用您的真实代码来测试 nack 处理。设置一个只执行 nack 的消费者...或者一个知道何时收到某些消息的消费者,它应该 nack


0
投票

我发现在发布消息时测试代理 nack 的最佳方法是设置队列最大长度并将溢出策略设置为

reject-publish
。一旦达到最大长度限制,这会导致代理
nack
任何消息。

参见兔子文档

my-pol 策略确保两个消息队列包含不超过 2 条消息,并且只要队列包含 2 条消息并且启用了发布者确认,所有其他发布都会发送 basic.nack 响应。

我可以在管理控制台中轻松完成此操作:

adding a policy via rabbitmq management console

注意:从 RabbitMQ 3.13.6 开始,这适用于经典队列和仲裁队列。

© www.soinside.com 2019 - 2024. All rights reserved.