Amqp: d.Ackはチャネルを閉じます

作成日 2013年10月22日  ·  3コメント  ·  ソース: streadway/amqp

一度に十分な数のメッセージ(たとえば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)
    }
}

最も参考になるコメント

助けてくれてありがとう。 私は二重の肯定応答(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)
}

全てのコメント3件

あなたの匿名の関数は、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)
}
このページは役に立ちましたか?
0 / 5 - 0 評価