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