Amqp: d.Ack menutup saluran

Dibuat pada 22 Okt 2013  ·  3Komentar  ·  Sumber: streadway/amqp

Jika saya mencapai konsumen dengan pesan yang cukup sekaligus (misalnya 10.000), menggunakan kode di bawah saluran ditutup dan tidak akan lagi menerima pengiriman baru. Namun, jika saya menghapus d.Ack dan hanya mencetak badan pengiriman, maka tidak ada masalah.

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

Komentar yang paling membantu

Terima kasih banyak atas bantuannya. @michaelklishin Saya sangat kecewa. Saya salah memahami fungsi anonim Go. Saya membuatnya bekerja dengan memecah fungsi terpisah dan menggunakannya dalam rutinitas go. Untuk orang lain yang melakukan kesalahan yang sama, kesalahan yang saya dapatkan adalah Pengecualian (406) Alasan: "PRECONDITION_FAILED - tag pengiriman tidak diketahui 24782"

Berikut kode kerjanya

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

Semua 3 komentar

Fungsi anonim Anda ditutup lebih dari d dari pernyataan for. Coba beri nama param dalam lingkup fungsi Anda.

Anda juga dapat menampilkan kesalahan saluran asinkron seperti:

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

@MattParker89 lihat log RabbitMQ, ini akan berisi pengecualian saluran. Anda hampir pasti pengiriman ganda.

Terima kasih banyak atas bantuannya. @michaelklishin Saya sangat kecewa. Saya salah memahami fungsi anonim Go. Saya membuatnya bekerja dengan memecah fungsi terpisah dan menggunakannya dalam rutinitas go. Untuk orang lain yang melakukan kesalahan yang sama, kesalahan yang saya dapatkan adalah Pengecualian (406) Alasan: "PRECONDITION_FAILED - tag pengiriman tidak diketahui 24782"

Berikut kode kerjanya

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)
}
Apakah halaman ini membantu?
0 / 5 - 0 peringkat