最小限の例を次に示します。
package main
import (
"fmt"
"github.com/streadway/amqp"
)
func main() {
conn, _ := amqp.Dial("amqp://guest:guest@localhost/")
defer conn.Close()
ch, _ := conn.Channel()
defer ch.Close()
q1, err := ch.QueueDeclare("test_qqq", /* durable: */ true, false, /* exclusive: */ false, false, nil)
handle(err)
fmt.Println("%+v", q1)
q2, err := ch.QueueDeclare("test_qqq", /* durable: */ true, false, /* exclusive: */ true, false, nil)
handle(err)
fmt.Println("%+v", q2)
}
func handle(err error) {
if err != nil {
panic(fmt.Sprintf("%v", err))
}
}
使用:
ご覧のとおり、この例では、同じキューを2回再作成しようとしています。最初は、 exclusive:true
、次にexclusive:false
ます。 期待どおりに失敗しますが、予期しないエラーメッセージが表示されます。
Exception (406) Reason: "PRECONDITION_FAILED - inequivalent arg 'durable' for queue 'test_qqq' in vhost '/': received 'false' but current is 'true'"
durable: true
ステートメントをぼんやりと見て30分過ごしましたが、実際にはexclusive
引数を調べる必要があります。 将来のユーザーをそのような時間の損失から守る方法はありますか? args 'durable' and 'exclusive' are in conflict with each other
ます。 それともRabbitMQの問題ですか?
キューガイドの宣言プロパティの同等性を参照してください。
キューガイドの宣言プロパティの同等性を参照してください。
毎週このような苦情が何十件も寄せられる可能性があることは承知していますが、ドキュメントを読んだことは間違いありません。 エラー自体やそのコードではなく、誤解を招くエラーメッセージに問題があります。 durable
をtrue
に設定する必要があると表示されますが、これはすでに行っています。 または、パッケージの障害ではなく、RabbitMQの障害であると言っているので、リポジトリに問題を報告する必要がありますか?
更新:パッケージのソースを確認しましたが、RabbitMQ側で問題が発生していることがわかりました。申し訳ありません。 ケースはここで閉じました。
@ SergeAx - https://github.com/rabbitmq/rabbitmq-server/issues/1887
基本的に、「排他的」の存在は永続的な議論を否定しますが、永続性が最初にチェックされます。 今修正中です。 問題を再現するためのコードをありがとう。
@SergeAx申し訳ありませんが、使用しているプロパティの組み合わせを見つけられませんでした。 確かに、そのような質問のほとんどは完全な初心者からのものなので、私は缶詰の回答を使用しました。
最も参考になるコメント
@ SergeAx - https://github.com/rabbitmq/rabbitmq-server/issues/1887
基本的に、「排他的」の存在は永続的な議論を否定しますが、永続性が最初にチェックされます。 今修正中です。 問題を再現するためのコードをありがとう。