単純なメッセージ送信者と消費者を作成し、spring-integrationとRabbitMqを使用してそれらをリンクしました。
RPC(要求/応答)スタイルのメッセージングを作成するために、アウトバウンドゲートウェイとインバウンドゲートウェイを使用しました。作成するためにこれを春に任せているので、返信チャネルを指定していません(返信用の匿名キューが作成されると想定しています)。
これは、コンシューマーが送信者の前に開始された場合は問題なく機能しますが、コンシューマーが送信者の後に開始された場合、応答を受信しません。コンシューマーがメッセージを受信したが、応答が返されないことがわかります。
さらに詳しく調べてみると、送信者がメッセージを送信すると、ウサギに一時的な匿名キューが作成され、メッセージの返信先ヘッダーにこのキュー名が含まれていることがわかります。ただし、このキューは、作成後すぐに、コンシューマーを起動する前に消えます。キューが存在しなくなったため、コンシューマーはキューへの応答を公開できないと思います。
ウサギの管理ツールから、匿名キューが排他的に設定され、自動削除がtrueに設定されていることがわかります。キューはスプリング統合によって作成されているため、これらのプロパティを制御することはできません。
誰かがこれを解決する方法について何かアイデアがありますか?私の設定は次のとおりです。
送信者:
<import resource="classpath:rabbit.xml" />
<int:channel id="output" />
<int:gateway id="senderGateway" service-interface="gordon.outbound.SenderGateway" default-request-channel="output"/>
<int-amqp:outbound-gateway request-channel="output"
amqp-template="amqpTemplate" exchange-name="silly-wabbit-exchange"
routing-key="silly-wabbit-key"/>
消費者:
<import resource="classpath:rabbit.xml" />
<int:channel id="input"/>
<int-amqp:inbound-gateway request-channel="input" queue-names="silly-wabbit-queue" connection-factory="connectionFactory"/>
<bean id="listenerService" class="gordon.inbound.ListenerService"/>
<int:service-activator input-channel="input" ref="listenerService" method="receiveMessage"/>