0

私は Spring-Integration について学んでおり、Gateway と Service-Activators について基本的な理解があります。ゲートウェイのコンセプトが大好きです。Spring Integration は、実行時にゲートウェイのプロキシを生成します。このプロキシは、すべてのメッセージングの詳細をゲートウェイのコンシューマから隠します。さらに、生成されたプロキシは、要求と応答を相互に関連付けている場合もあります。

学習の目的で、ゲートウェイを使用せずに生の Spring Integration 機能を使用して、リクエストと応答の相関関係を実装することに着手しました。リクエスト ヘッダーに相関識別子を設定することはできますが、チャネルの応答を受信中に相関識別子を指定することはできません。以下(質問の最後)は、同じコードスニペットです。また、相関関係はメッセージ ブローカー (RabbitMQ など) に対してどのように機能しますか? RabbitMQ は、特定のヘッダー (相関識別子) を含むメッセージを取得する機能を提供しますか?

public class RemoteProxyCalculatorService implements CalculatorService
{
    public int Square(int n) 
    {
        UUID uuid = SendRequest(n, "squareRequestChannel");
        int squareOfn = ReceiveReply("squareReplyChannel", uuid);
        return squareOfn;
    }

    private <T> UUID SendRequest(T payload, String requestChannel)
    {
        UUID requestID = UUID.randomUUID();
        Message<T> inputMessage = MessageBuilder.withPayload(payload)
                .setCorrelationId(requestID)
                .build();

        MessageChannel channel = (MessageChannel)context.getBean(requestChannel, MessageChannel.class);
        channel.send(inputMessage);
        return requestID;
    }

    @SuppressWarnings("unchecked")
    private <T> T ReceiveReply(String replyChannel, UUID requestID)
    {
        //How to consume requestID so as to receive only the reply related to the request posted by this thread
        PollableChannel channel = (PollableChannel)context.getBean(replyChannel);
        Message<?> groupMessage = channel.receive();
        return (T)groupMessage.getPayload();
    }

    private ClassPathXmlApplicationContext context;
}

ありがとう。

4

3 に答える 3

1

アプリ内で相互に関連付ける最も簡単な方法は、correlationId ヘッダーさえ必要としません。代わりに、QueueChannel インスタンス (共有しないもの) を作成し、送信するメッセージの replyChannel ヘッダーとしてそれを提供できます。ダウンストリーム コンポーネントが最終的に応答するものは何でも、メッセージ内でそのヘッダーを見つけます。

RabbitMQ に関して、アウトバウンド ゲートウェイは単純に同様の手法を適用しますが、AMQP メッセージの replyTo プロパティを使用します。

それが役立つことを願っています。

-マーク

于 2013-07-10T19:43:59.893 に答える