Si je frappe le consommateur avec suffisamment de messages à la fois (par exemple 10 000), en utilisant le code ci-dessous, le canal se ferme et n'acceptera plus de nouvelles livraisons. Cependant, si je supprime d.Ack et que je n'imprime que le corps de la livraison, il n'y a pas de problème.
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)
}
}
Votre fonction anonyme se ferme à plus de d
de l'instruction for. Essayez de nommer le paramètre dans la portée de votre fonction.
Vous pouvez également afficher des erreurs de canal asynchrones telles que :
go func() {
log.Fatal(<-channel.NotifyClose(make(chan *amqp.Error)))
}()
@MattParker89 voir le journal RabbitMQ, il contiendra une exception de canal. Vous êtes presque certainement en train de doubler les livraisons.
Merci beaucoup pour l'aide. @michaelklishin J'étais en double. J'ai mal compris les fonctions anonymes de Go. Je l'ai fait fonctionner en décomposant une fonction distincte et en l'utilisant dans la routine go. Pour toute autre personne qui fait la même erreur, l'erreur que j'ai reçue était l'exception (406) Raison : "PRECONDITION_FAILED - étiquette de livraison inconnue 24782"
Voici le code de travail
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)
}
Commentaire le plus utile
Merci beaucoup pour l'aide. @michaelklishin J'étais en double. J'ai mal compris les fonctions anonymes de Go. Je l'ai fait fonctionner en décomposant une fonction distincte et en l'utilisant dans la routine go. Pour toute autre personne qui fait la même erreur, l'erreur que j'ai reçue était l'exception (406) Raison : "PRECONDITION_FAILED - étiquette de livraison inconnue 24782"
Voici le code de travail