Amqp: d.Ack schließt den Kanal

Erstellt am 22. Okt. 2013  ·  3Kommentare  ·  Quelle: streadway/amqp

Wenn ich den Verbraucher mit genügend Nachrichten auf einmal treffe (zB 10.000), wird der Kanal mit dem Code darunter geschlossen und es werden keine neuen Lieferungen mehr angenommen. Wenn ich jedoch d.Ack entferne und nur den Hauptteil der Lieferung drucken lasse, gibt es kein Problem.

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

Hilfreichster Kommentar

Vielen Dank für die Hilfe. @michaelklishin Ich habe doppelt geglaubt. Ich habe die anonymen Funktionen von Go falsch verstanden. Ich habe es zum Laufen gebracht, indem ich eine separate Funktion herausgebrochen und diese in der Go-Routine verwendet habe. Für alle anderen, die den gleichen Fehler machen, lautete die Fehlermeldung Ausnahme (406) Grund: "PRECONDITION_FAILED - unbekannter Liefertag 24782"

Hier ist der Arbeitscode

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

Alle 3 Kommentare

Ihre anonyme Funktion wird über d von der for-Anweisung geschlossen. Versuchen Sie, den Parameter im Bereich Ihrer Funktion zu benennen.

Sie können auch asynchrone Kanalfehler anzeigen wie:

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

@MattParker89 siehe RabbitMQ-Protokoll, es enthält eine Kanalausnahme. Sie sind mit ziemlicher Sicherheit doppelte Lieferungen.

Vielen Dank für die Hilfe. @michaelklishin Ich habe doppelt geglaubt. Ich habe die anonymen Funktionen von Go falsch verstanden. Ich habe es zum Laufen gebracht, indem ich eine separate Funktion herausgebrochen und diese in der Go-Routine verwendet habe. Für alle anderen, die den gleichen Fehler machen, lautete die Fehlermeldung Ausnahme (406) Grund: "PRECONDITION_FAILED - unbekannter Liefertag 24782"

Hier ist der Arbeitscode

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)
}
War diese Seite hilfreich?
0 / 5 - 0 Bewertungen