如果我一次向消费者发送足够多的消息(例如 10,000 条),则使用通道下方的代码将关闭并且不再接受新的交付。 但是,如果我删除 d.Ack 并只打印交付的正文,则没有问题。
func main() {
conn, _ := amqp.Dial(*uri)
channel, _ := conn.Channel()
deliveries, _ := channel.Consume(
*queue, //queue
"",
false,
false,
false,
false,
nil)
for d := range deliveries {
go func(amqp.Delivery) {
log.Printf("got %s", d.Body)
d.Ack(false)
}(d)
}
}
您的匿名 func 正在关闭 for 语句中的d
。 尝试在您的 func 范围内命名参数。
您还可以显示异步通道错误,例如:
go func() {
log.Fatal(<-channel.NotifyClose(make(chan *amqp.Error)))
}()
@MattParker89查看 RabbitMQ 日志,它将包含一个通道异常。 您几乎可以肯定是双重确认交付。
非常感谢帮忙。 @michaelklishin我是双重确认。 我误解了 Go 匿名函数。 我通过分解一个单独的函数并在 go 例程中使用它来让它工作。 对于犯同样错误的任何其他人,我得到的错误是异常(406)原因:“PRECONDITION_FAILED - 未知交付标签24782”
这是工作代码
func main() {
conn, _ := amqp.Dial(*uri)
channel, _ := conn.Channel()
deliveries, _ := channel.Consume(
*queue, //queue
"",
false,
false,
false,
false,
nil)
for d := range deliveries {
go doSomeWork(d)
}
}
func doSomeWork(d amqp.Delivery){
log.Printf("got %s", d.Body)
d.Ack(false)
}
最有用的评论
非常感谢帮忙。 @michaelklishin我是双重确认。 我误解了 Go 匿名函数。 我通过分解一个单独的函数并在 go 例程中使用它来让它工作。 对于犯同样错误的任何其他人,我得到的错误是异常(406)原因:“PRECONDITION_FAILED - 未知交付标签24782”
这是工作代码