Amqp: d.Ack cierra el canal

Creado en 22 oct. 2013  ·  3Comentarios  ·  Fuente: streadway/amqp

Si golpeo al consumidor con suficientes mensajes a la vez (por ejemplo, 10,000), al usar el código a continuación, el canal se cierra y ya no aceptará nuevas entregas. Sin embargo, si elimino d.Ack y solo imprimo el cuerpo de la entrega, no hay 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)
    }
}

Comentario más útil

Muchísimas gracias por la ayuda. @michaelklishin Estaba doblegando. Entendí mal las funciones de Go anonymous. Lo hice funcionar rompiendo una función separada y usándola en la rutina de ir. Para cualquier otra persona que cometa el mismo error, el error que obtuve fue Excepción (406) Motivo: "PRECONDITION_FAILED: etiqueta de entrega desconocida 24782"

Aquí está el código de trabajo

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 comentarios

Su función anónima está cerrando más de d de la declaración for. Intente nombrar el parámetro dentro del alcance de su función.

También puede mostrar errores de canal asincrónico como:

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

@ MattParker89 vea el registro de RabbitMQ, contendrá una excepción de canal. Es casi seguro que estás haciendo un doble seguimiento de los partos.

Muchísimas gracias por la ayuda. @michaelklishin Estaba doblegando. Entendí mal las funciones de Go anonymous. Lo hice funcionar rompiendo una función separada y usándola en la rutina de ir. Para cualquier otra persona que cometa el mismo error, el error que obtuve fue Excepción (406) Motivo: "PRECONDITION_FAILED: etiqueta de entrega desconocida 24782"

Aquí está el código de trabajo

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)
}
¿Fue útil esta página
0 / 5 - 0 calificaciones