【发布时间】:2015-03-05 18:28:51
【问题描述】:
我正在编写一个带有发布者确认的 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 并且没有绑定与路由键匹配的队列,或者当 立即标志为真,匹配队列上没有消费者准备好 接受交货
我向不存在的队列发送消息的方法是错误的方法吗?还有其他方法可以发送会引起发布者不同意的消息吗?
【问题讨论】:
-
如果您想从服务器获得消息已传递到队列的确认(并在持久消息的情况下最终持久),那么您需要使用发布者确认。