gpt4 book ai didi

go - 如何验证发布者确认行为

转载 作者:IT王子 更新时间:2023-10-29 02:05:27 24 4
gpt4 key购买 nike

我正在编写一个带有发布者确认的 go 程序,我想验证消息可以传递/不能传递给代理时的行为。

我正在通过设置队列的集成测试执行此操作,并要求我的系统代码发送到该队列名称。验证发布者 ack 的行为没有问题,但我不能挑起导致发布者 nack 的情况。

我尝试使用以下代码将消息发送到不存在的队列:

connection, err := amqp.Dial("amqp://localhost")
if err != nil {
panic(err)
}
defer connection.Close()
channel, err := connection.Channel()
if err != nil {
panic(err)
}
err = channel.Confirm(false)
if err != nil {
panic(err)
}
pubAck, pubNack := channel.NotifyConfirm(make(chan uint64, 1), make(chan uint64, 1))
fmt.Println("Publish to queue: ", queueName)
msg := amqp.Publishing{
Body: []byte("Hello")}
err = channel.Publish("", queueName, true, true, msg)
if err != nil {
panic(err)
}
select {
case <-pubAck:
fmt.Println("Ack")
case <-pubNack:
fmt.Println("NAck")
}

队列名确实是一个不存在的队列,执行sudo rabbitmqctl list_queues显示队列列表为空。

但它仍然打印“Ack”

我已将 mandatoryimmediate 都设置为 true

Publishings can be undeliverable when the mandatory flag is true and no queue is bound that matches the routing key, or when the immediate flag is true and no consumer on the matched queue is ready to accept the delivery

我向不存在的队列发送消息的方法是否错误,是否有另一种方法可以发送会引起发布者 nack 的消息?

最佳答案

RabbitMQ 只会返回一个 basic.nack 如果

an internal error occurs in the Erlang process responsible for a queue.

因此,basic.ack/basic.nack 仅确认 RabbitMQ 代理是否收到消息,而不是“最终”消费者是否收到消息。请参阅 this 上“否定确认”的最后一句话页面。

关于go - 如何验证发布者确认行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28885109/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com