Amqp: d.Ack 关闭通道

创建于 2013-10-22  ·  3评论  ·  资料来源: streadway/amqp

如果我一次向消费者发送足够多的消息(例如 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)
    }
}

最有用的评论

非常感谢帮忙。 @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)
}

所有3条评论

您的匿名 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)
}
此页面是否有帮助?
0 / 5 - 0 等级

相关问题

parthibd picture parthibd  ·  3评论

kpurdon picture kpurdon  ·  22评论

pnuz3n picture pnuz3n  ·  17评论

michaeljs1990 picture michaeljs1990  ·  11评论

SergeAx picture SergeAx  ·  5评论