4

という名前の RabbitMQ サーバー上のキューを指定しましたMyQueue。それは耐久性があり、にx-dead-letter-exchange設定されていMyQueue.DLXます。

(私はまた、MyExchangeそのキューにバインドされた と呼ばれる交換と と呼ばれる別の交換MyQueue.DLXを持っていますが、これが質問にとって重要であるとは思いません)

amqpこれらのメッセージをサブスクライブするためにruby​​ の gem を使用する場合、次のようにします。

# Doing this before and in a new thread has to do with how my code is structured
# shown here in case it has a bearing on the question
Thread.new do
  AMQP.start('amqp://guest:guest@127.0.0.1:5672')
end

EventMachine.next_tick do
  channel = AMQP::Channel.new(AMQP.connection)

  queue = channel.queue("MyQueue", :durable => true, :'x-dead-letter-exchange' => "MyQueue.DLX")

  queue.subscribe(:ack => true) do |metadata, payload|
    p metadata
    p payload
  end
end

キューとエクスチェンジが既に作成されバインドされている状態でこのコードを実行すると (セットアップに必要なため)、RabbitMQ はログに次のエラーをスローします。

=ERROR REPORT==== 19-Aug-2013::14:25:53 ===
connection <0.19654.2>, channel 2 - soft error:
{amqp_error,precondition_failed,
        "inequivalent arg 'x-dead-letter-exchange'for queue 'MyQueue' in vhost '/': received none but current is the value 'MyQueue.DLX' of type 'longstr'",
        'queue.declare'}

これは、既存のキューと同じ Dead Letter Exchange を指定していないqueue = ...ことを示しているようですが、この行には指定したと思います。

何か案は?

4

2 に答える 2

0

オプションに @Karl Wilbur の形式を使用していても、同じエラーが発生しました。

あなたの「MyQueue」はすでにRabbitMQサーバーに存在しているように見え(durable:true)、デッドレター交換構成なしで存在しています。

queue = channel.queue("MyQueue", :durable => true, :'x-dead-letter-exchange' => "MyQueue.DLX")

「MyQueue」という名前のキューがすでに存在する場合、これは新しいキューを作成しません。代わりに、既存のものに接続しようとしますが、オプション/引数などは同じでなければなりません。そうしないと、取得したようなエラーが発生します。

古いコードを削除して、コードを再度実行するだけです (Karl の提案による)。

RabbitMQ 管理 GUI を使用して削除しました。キューの再削除については、こちらを参照してください

于 2016-02-25T06:19:11.243 に答える