Amqp: d.Ack fecha o canal

Criado em 22 out. 2013  ·  3Comentários  ·  Fonte: streadway/amqp

Se eu atingir o consumidor com mensagens suficientes de uma só vez (ex: 10.000), usando o código abaixo o canal fecha e não aceita mais novas entregas. Porém, se eu remover d.Ack e apenas tiver o corpo da entrega sendo impresso, não há problema.

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)
    }
}

Comentários muito úteis

Muito obrigado pela ajuda. @michaelklishin, eu estava acertando duas vezes. Eu não entendi as funções anônimas do Go. Eu fiz isso funcionar quebrando uma função separada e usando-a na rotina. Para qualquer outra pessoa que cometer o mesmo erro, o erro que recebi foi Motivo de exceção (406): "PRECONDITION_FAILED - etiqueta de entrega desconhecida 24782"

Aqui está o código de trabalho

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)
}

Todos 3 comentários

Sua função anônima está fechando mais de d da instrução for. Tente nomear o parâmetro no escopo de sua função.

Além disso, você pode mostrar erros de canal assíncrono como:

go func() {
  log.Fatal(<-channel.NotifyClose(make(chan *amqp.Error)))
}()

@ MattParker89 veja o log do RabbitMQ, ele conterá uma exceção de canal. Você quase certamente está fazendo entregas duplas.

Muito obrigado pela ajuda. @michaelklishin, eu estava acertando duas vezes. Eu não entendi as funções anônimas do Go. Eu fiz isso funcionar quebrando uma função separada e usando-a na rotina. Para qualquer outra pessoa que cometer o mesmo erro, o erro que recebi foi Motivo de exceção (406): "PRECONDITION_FAILED - etiqueta de entrega desconhecida 24782"

Aqui está o código de trabalho

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)
}
Esta página foi útil?
0 / 5 - 0 avaliações