Amqp: d.Ack ferme le canal

Créé le 22 oct. 2013  ·  3Commentaires  ·  Source: streadway/amqp

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

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

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

Tous les 3 commentaires

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)
}
Cette page vous a été utile?
0 / 5 - 0 notes

Questions connexes

michaeljs1990 picture michaeljs1990  ·  11Commentaires

parthibd picture parthibd  ·  3Commentaires

kamal-github picture kamal-github  ·  9Commentaires

kpurdon picture kpurdon  ·  22Commentaires

auyer picture auyer  ·  4Commentaires