我正在编写一个发布程序确认的go程序,我想验证消息何时可以传递/不传递给代理的行为。
我是通过设置队列的集成测试来执行此操作,并要求我的系统代码发送到该队列名称。验证发布者确认行为是没有问题的,但是我不能引起导致发布者麻烦的情况。
我尝试使用以下代码将消息发送到不存在的队列:
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”
我已将mandatory
和immediate
都设置为true
强制标志出现时,发布无法送达 true,没有绑定与路由键匹配的队列,或者 立即标志为true,匹配队列上没有消费者准备就绪 接受交付
我发送到不存在的队列的方法是错误的方法,还有另一种方法可以发送一条消息,引发发布者nack吗?
答案 0 :(得分:2)
RabbitMQ只返回basic.nack
if
在负责队列的Erlang进程中发生内部错误。
因此,basic.ack
/ basic.nack
仅确认RabbitMQ经纪人是否收到了该消息,而不是确定&#34;最终&#34;消费者做了。请参阅&#34;否定确认&#34;的最后一句在this页上。