如何强制 RabbitMQ 代理 NACK 测试消息?
Posted
技术标签:
【中文标题】如何强制 RabbitMQ 代理 NACK 测试消息?【英文标题】:How can I force a RabbitMQ broker to NACK a message for testing? 【发布时间】:2016-02-08 20:39:14 【问题描述】:我正在通过 Spring AMQP 使用 RabbitMQ 开发 Spring Boot 项目。我们希望能够在消息发布为 NACK 时测试我们的应用程序的行为(特别是当 PublisherConfirmCallback#confirm
的 ack
参数为 false
时)。但是,我们很难尝试在集成测试中设置此场景(也就是说,在应用运行的情况下,而不是单元测试)。
为了清楚起见,我们正在测试发布者致谢,而不是消费者致谢。
我们知道您可以使用 RabbitTemplate 的 execute
方法访问通道,但是我们的 RabbitMQ 自动应答,因此在执行通道回调时消息已经消失。我们认为我们可以在运行时禁用自动确认(以免中断测试套件)或简单地阻塞通道并在测试中手动接收消息,但我们无法弄清楚如何做这些。但实际上,任何在测试期间引起 NACK 的方法都很棒。
tl;dr 如何从客户端代码接收消息
【问题讨论】:
【参考方案1】:向不存在的交换器发布消息将导致发布者确认回调收到 nack!
【讨论】:
从 C# 客户端我得到:RabbitMQ.Client.Exceptions.AlreadyClosedException:已经关闭:AMQP 操作被中断:AMQP 关闭原因,由 Peer 发起,code=404,text=' NOT_FOUND - 在 vhost '/'' 中没有交换 'invalidExchangeForNack',classId=60,methodId=40 从 java 客户端,我发现 Rabbit 以关闭通道响应发布,所以这对我也不起作用。我附加到流量侦听器的一些日志记录的输出:rabbitmq 读取:#method您必须先关闭自动确认功能。启用该功能后,将无法接收消息。
之后,您的测试设置应包括一个消息使用者,该消息使用者经过专门编码,可在您需要时执行您想要的操作...不要使用您的真实代码来测试 nack 处理。设置一个只做一个 nack 的消费者......或者一个知道它何时收到某些消息的消费者,它应该 nack
【讨论】:
感谢您的回复,但我认为我们在谈论两件不同的事情。我的问题是关于出版商致谢(我已经对其进行了编辑以使其更加明显)以上是关于如何强制 RabbitMQ 代理 NACK 测试消息?的主要内容,如果未能解决你的问题,请参考以下文章