1

何かわかりません。Spring Integration を使用して、RabbitMQ からメッセージを送受信しています。

私のトポロジは非常に単純です。

  • 1 つの JVM が Spring の RabbitTemplate を使用してメッセージを生成する

    <rabbit:template id="rabbitTemplate" connection-factory="rabbitConnectionFactory" />
    
    <bean id="amqpTemplate" parent="rabbitTemplate">
        <property name="queue" value="${queue.name}" />
        <property name="routingKey" value="${queue.name}" />
    </bean>
    
  • RabbitMQ キューがメッセージを受信

    <rabbit:queue name="${queue.name}" durable="true" />
    
  • 別の JVM がメッセージを消費します (Spring-Batch ジョブを起動するためですが、それは重要ではありません)。

    <int-amqp:inbound-channel-adapter
          queue-names="${queue.name}"
          channel="amqp-requests"
          connection-factory="rabbitConnectionFactory" />
    

使用される送信方法は次のとおりです。

/**
 * Convert a Java object to an Amqp {@link Message} and send it to a default exchange with a default routing key.
 * 
 * @param message a message to send
 * @throws AmqpException if there is a problem
 */
void convertAndSend(Object message) throws AmqpException;

それは正常に動作しますが、ドキュメントによると、私のユースケースではroutingKeyが必須ではないと思います。誰かがルーティングキーを置いた理由がわかりません。

だから私はroutingKeyを削除しようとしました:

<bean id="amqpTemplate" parent="rabbitTemplate">
    <property name="queue" value="${queue.name}" />
</bean>

その後、引き続きメッセージをキューに送信できますが、メッセージが消費されることはありません! 誰かが私に何が起こっているのか説明できますか? routingKey がないと、ある JVM から別の JVM にメッセージを送信できませんか?

4

1 に答える 1

3

...しかし、ドキュメントによると、routingKeyは必須ではないと思います...

どの「ドキュメント」を参照していますか?

AMQPでは、プロデューサーはキューについて知りません。それらは、キューにルーティングするためのバインディングを持つさまざまなタイプの交換にメッセージを送信します。

たぶん、あなたはすべてqueueがバインドされているデフォルトの交換の概念を誤解routing keyしているかもしれませんqueue name

これにより、特定のキューへの(名前による)単純なルーティングが可能になります。デフォルトの交換は、amqpメッセージングへの迅速なオンランプを提供するのに便利です。これは問題なく機能しますが、プロデューサーとコンシューマーをさらに切り離すため、代わりに明示的に宣言された交換の使用を検討することをお勧めします。デフォルトの交換では、プロデューサーはコンシューマーがリッスンしているキューの名前を知っている必要があります。

さらに、RabbitTemplateでは、queueプロパティはメッセージの受信(消費)にのみ使用され、メッセージの送信には関係ありません。私が言ったように、プロデューサーはキューについて知りません。

次を使用する必要があります...

<bean id="amqpTemplate" parent="rabbitTemplate">
    <property name="routing-key" value="${queue.name}" />
</bean>
于 2012-12-26T15:30:55.000 に答える