3

単純なメッセージ送信者と消費者を作成し、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"/>
4

1 に答える 1

2

デフォルトのreplyTimeoutは5秒です。コンシューマーが5秒以内に応答しない場合、アウトバウンドゲートウェイのコンシューマーはキャンセルされ、一時キューが削除されます。

<rabbit:template />(ミリ秒)でreply-timeoutを構成することにより、タイムアウトを増やすことができます。

于 2012-10-24T15:59:44.473 に答える