【问题标题】:How do I verify publisher acknowledge behavior如何验证发布者确认行为
【发布时间】: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”

我已将 mandatoryimmediate 都设置为 true

当强制标志为 true 并且没有绑定与路由键匹配的队列,或者当 立即标志为真,匹配队列上没有消费者准备好 接受交货

我向不存在的队列发送消息的方法是错误的方法吗?还有其他方法可以发送会引起发布者不同意的消息吗?

【问题讨论】:

  • 如果您想从服务器获得消息已传递到队列的确认(并在持久消息的情况下最终持久),那么您需要使用发布者确认。

标签: go rabbitmq amqp


【解决方案1】:

RabbitMQ 只会返回 basic.nack 如果

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

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

【讨论】:

  • 如果我理解正确的话,这几乎意味着我不能以编程方式引起出版商 nack?
  • 您可能可以为 RabbitMQ 编写一些插件,当您发布到某个虚拟主机时,交换和/或路由密钥会故意以强制发布者.nack 的方式死亡.但是是的,一般来说这是不可能的。
猜你喜欢
  • 1970-01-01
  • 2011-02-09
  • 2020-03-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-01
  • 2017-05-15
  • 2020-09-28
相关资源
最近更新 更多