如何验证发布者确认行为

时间:2015-03-05 18:28:52

标签: go rabbitmq amqp

我正在编写一个发布程序确认的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”

我已将mandatoryimmediate都设置为true

  

强制标志出现时,发布无法送达   true,没有绑定与路由键匹配的队列,或者   立即标志为true,匹配队列上没有消费者准备就绪   接受交付

我发送到不存在的队列的方法是错误的方法,还有另一种方法可以发送一条消息,引发发布者nack吗?

1 个答案:

答案 0 :(得分:2)

RabbitMQ只返回basic.nack if

  

在负责队列的Erlang进程中发生内部错误。

因此,basic.ack / basic.nack仅确认RabbitMQ经纪人是否收到了该消息,而不是确定&#34;最终&#34;消费者做了。请参阅&#34;否定确认&#34;的最后一句在this页上。