Amqp: d.Ack يغلق القناة

تم إنشاؤها على ٢٢ أكتوبر ٢٠١٣  ·  3تعليقات  ·  مصدر: streadway/amqp

إذا أصبت بالمستهلك بعدد كافٍ من الرسائل دفعة واحدة (على سبيل المثال ، 10000) ، فسيتم إغلاق القناة باستخدام الكود أدناه ولن تستقبل عمليات تسليم جديدة بعد الآن. ومع ذلك ، إذا قمت بإزالة 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)
    }
}

التعليق الأكثر فائدة

شكرا جزيلا علي المساعدة. michaelklishin كنت أتعامل مع مضاعفة. لقد أسأت فهم وظائف الذهاب مجهولة. لقد نجحت في ذلك من خلال تقسيم وظيفة منفصلة واستخدامها في روتين الذهاب. بالنسبة لأي شخص آخر قام بنفس الخطأ ، الخطأ الذي تلقيته كان استثناء (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 كومينتر

يتم إغلاق func المجهول الخاص بك أكثر من d من بيان for. حاول تسمية المعلمة في نطاق وظيفتك.

كما يمكنك إظهار أخطاء القناة غير المتزامنة مثل:

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

@ MattParker89 راجع سجل RabbitMQ ، وسيحتوي على استثناء للقناة. من شبه المؤكد أنك تقوم بالتسليم مرتين.

شكرا جزيلا علي المساعدة. michaelklishin كنت أتعامل مع مضاعفة. لقد أسأت فهم وظائف الذهاب مجهولة. لقد نجحت في ذلك من خلال تقسيم وظيفة منفصلة واستخدامها في روتين الذهاب. بالنسبة لأي شخص آخر قام بنفس الخطأ ، الخطأ الذي تلقيته كان استثناء (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 التقييمات