2

私は深刻な頭痛の種となっているいくつかのレガシーRabbitMQコードを継承しています。理想的には、同様の質問を参照できる「公式」ドキュメントを参照してください。

次のようなチャネルを使用して検索を実行するワーカーからの応答を受け取るいくつかのチャネルを作成します。

channelIn.queueDeclare("", false, false, true, null);
channelIn.queueBind("", AmqpClient.NAME_EXCHANGE,
     AmqpClient.ROUTING_KEY_ROOT_INCOMING + uniqueId);

メーリングリストやフォーラムを閲覧してわかったことは、

  • 空の名前でキューを宣言すると、サーバーは一意の名前を自動生成できます。
  • キューにはグローバルに一意の名前が必要です。

これは本当ですか?

また、上記の 2 行目で、ブログやメーリング リストのリベラルな解釈に基づく私の理解では、空のキュー名を持つ queuebind は、最後に作成されたキューに自動的にバインドされます。自動生成された名前をぎこちない DeclareOK オブジェクトから引き出す必要がないので、これはいいことのように思えます。

これは本当ですか?もしそうなら、これはマルチスレッド環境で動作しますか?

つまり、一部のチャネルが別のチャネルのキューにバインドされ、その別のチャネルが閉じられた場合、正しくバインドされていないチャネルがキューを使用しようとするとエラーが発生する可能性はありますか? (キューは autodelete=true で作成されていることに注意してください。) 私のテストでは、はい、と思いましたが、そこに問題があるとは確信していません。

4

2 に答える 2

0

これがマルチスレッド環境で機能するかどうかはわかりません。ほとんどの場合は問題ないかもしれませんが、間違ったキューを取得する可能性があります。なぜリスクを取るのですか?これはより良く、より安全ではないでしょうか?

String queueName = channelIn.queueDeclare("", false, false, true, null).getQueue();
channelIn.queueBind(queueName, AmqpClient.NAME_EXCHANGE,
 AmqpClient.ROUTING_KEY_ROOT_INCOMING + uniqueId);

まったく不格好ではありません。

于 2012-05-11T13:30:31.743 に答える