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