13

それぞれ独自の RabbitMQ インスタンスを持つ 3 つのクライアントがあり、独自の RabbitMQ インスタンスを持つアプリケーション (appA と呼びましょう) があり、3 つのクライアント アプリケーション (app1、app2、app3) は appA のサービスを利用したいと考えています。

appA のサービスには RPC 通信が必要で、app1、app2、app3 にはそれぞれ booking.request キューと booking.response キューがあります。

ここに画像の説明を入力

shovel プラグインを使用すると、すべての booking.request メッセージを app1-3 から appA に転送できます。

Shovel1 
virtualHost=appA, 
name=booking-request-shovel, 
sourceURI=amqp://userForApp1:password@app1-server/vhostForApp1
queue=booking.request
destinationURI=amqp://userForAppA:password@appA-server/vhostForAppA
queue=booking.request

setup another shovel to get booking requests from app2 and app3 to appA in the same way as above.

これで、appA は booking.response キューのリクエストに応答します。app1、app2、または app3 のいずれかの正しい booking.response キューに戻るには、rabbitMQ-appA の予約応答メッセージが必要ですが、それらすべてにではありません。独自の booking.response キューで応答を期待している正しい rabbitMQ (app1、app2、app3) に応答を転送する、rabbitMQ-appA にシャベル/フェデレーテッド キューをセットアップしますか?

これらのアプリはすべて spring-amqp を使用しています (関連する場合)。または、Spring で複数の rabbitMQ キューをリッスンし、それぞれから消費する rabbitMQ テンプレートをセットアップすることもできます。

ドキュメントから、これは典型的な消費者がどのように見えるかです:

<rabbit:listener-container connection-factory="rabbitConnectionFactory">
    <rabbit:listener queues="some.queue" ref="somePojo" method="handle"/>
</rabbit:listener-container>

接続ファクトリーがRabbitMQの同じインスタンスにあるが、vhostが異なる場合でも、これを行うために複数の接続ファクトリーを指定することは可能ですか?

ここに画像の説明を入力

更新

Josh の回答に基づいて、複数の接続ファクトリが必要です。

 <rabbit:connection-factory
                id="connectionFactory1"
                port="${rabbit.port1}"
                virtual-host="${rabbit.virtual1}"
                host="${rabbit.host1}"
                username="${rabbit.username1}"
                password="${rabbit.password1}"
                connection-factory="nativeConnectionFactory" />

 <rabbit:connection-factory
                id="connectionFactory2"
                port="${rabbit.port2}"
                virtual-host="${rabbit.virtual2}"
                host="${rabbit.host2}"
                username="${rabbit.username2}"
                password="${rabbit.password2}"
                connection-factory="nativeConnectionFactory" />

次に、SimpleRoutingConnectionFactory を使用して両方の接続ファクトリをラップします。

<bean id="connectionFactory" class="org.springframework.amqp.rabbit.connection.SimpleRoutingConnectionFactory">
    <property name="targetConnectionFactories">
        <map>
            <entry key="#{connectionFactory1.virtualHost}" ref="connectionFactory1"/>
            <entry key="#{connectionFactory2.virtualHost}" ref="connectionFactory2"/>
        </map>
    </property>
</bean>

ここで、rabbitMQ テンプレートを宣言するときに、個々の接続ファクトリではなく、SimpleRoutingConnectionFactory を指すようにします。

<rabbit:template id="template" connection-factory="connectionFactory" />

...そして、通常使用するようにテンプレートを使用します...

<rabbit:listener-container
        connection-factory="connectionFactory"
        channel-transacted="true"
        requeue-rejected="true"
        concurrency="${rabbit.consumers}">
        <rabbit:listener queues="${queue.booking}" ref="TransactionMessageListener" method="handle"  />
</rabbit:listener-container>

// メッセージは両方の rabbitMQ インスタンスから消費されます

... と ...

  @Autowired
  private AmqpTemplate template;

  template.send(getExchange(), getQueue(), new Message(gson.toJson(message).getBytes(), properties));

// メッセージは両方のキューにパブリッシュされます

私は正しいですか?

4

2 に答える 2