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