16

RabbitMQ のChannel#basicConsumeメソッドは、次の引数を提供します。

channel.basicConsume(queueName, autoAck, consumerTag, noLocal,
    exclusive, arguments, callback);

どのキューから消費したいかをRabbitMQに正確に伝える機能を提供します。

しかしChannel#basicPublish、そのような等価性はありません:

channel.basicPublish(exchangeName, routingKey, mandatory, immediateFlag,
    basicProperties, messageAsBytes);

ここで発行するキューを指定できないのはなぜですか?!? たとえば、という名前のキューへの発行を取得するにはどうすればよいですか? Channellogging前もって感謝します!

4

3 に答える 3

33

@Tien Nguyen の回答を拡張するために、RabbitMQ には「チート」があり、効果的にキューに直接公開できます。各キューは、ルーティング キーとしてキューの名前を使用して、AMQP の既定の交換に自動的にバインドされます。デフォルトの交換は「名前のない交換」とも呼ばれます。つまり、その名前は空の文字列です。そのため、キューの名前と同じルーティング キーで指定された交換に発行すると""、メッセージはそのキューだけに送信されます。@ジョンが言ったように、交換を行っていますが、自分自身を宣言またはバインドする必要があるだけではありません。

このコードを試すのに便利な Java クライアントはありませんが、動作するはずです。

channel.basicPublish("", myQueueName, false, false, null, myMessageAsBytes);

とはいえ、これはRabbitMQの仕組みの精神にほとんど反しています。通常のアプリケーション フローでは、交換を宣言してバインドする必要があります。ただし、例外的な場合には、「チート」が役立ちます。たとえば、Rabbit Admin Console を使用すると、交換を作成してバインドするという儀式を一切行わずに、手動でメッセージをキューに発行できるようになると思います。

于 2014-05-06T18:53:49.987 に答える