一度に十分な数のメッセージ(たとえば10,000)で消費者にヒットした場合、チャネルの下のコードを使用すると閉じ、新しい配信を受け取らなくなります。 ただし、d.Ackを削除して、配信の本文を印刷するだけであれば、問題はありません。
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)
}
}
あなたの匿名の関数は、forステートメントからd
を超えて閉じています。 funcのスコープでparamに名前を付けてみてください。
また、次のような非同期チャネルエラーを表示することもできます。
go func() {
log.Fatal(<-channel.NotifyClose(make(chan *amqp.Error)))
}()
@ MattParker89はRabbitMQログを参照してください。チャネル例外が含まれます。 あなたはほぼ間違いなく配達を二重に確認しています。
助けてくれてありがとう。 私は二重の肯定応答(ACK)だった@michaelklishin。 Go匿名関数を誤解しました。 別の関数を分割し、それをgoルーチンで使用することで機能しました。 同じ間違いを犯した他の人にとって、私が得たエラーは例外(406)でした。理由:「PRECONDITION_FAILED-不明な配信タグ24782」
これが作業コードです
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)
}
最も参考になるコメント
助けてくれてありがとう。 私は二重の肯定応答(ACK)だった@michaelklishin。 Go匿名関数を誤解しました。 別の関数を分割し、それをgoルーチンで使用することで機能しました。 同じ間違いを犯した他の人にとって、私が得たエラーは例外(406)でした。理由:「PRECONDITION_FAILED-不明な配信タグ24782」
これが作業コードです