3

RabbitMQのSTOMPアダプターを使用してRPCを実行しようとしています。クライアントライブラリとして、STOMP over WebSocket(https://github.com/jmesnil/stomp-websocket/)ライブラリを使用しています。

ドキュメント(http://www.rabbitmq.com/stomp.html#d.tqd)から、reply-toヘッダーを設定する必要があることがわかります。「reply-to:/ temp-queue / foo」のようなものを指定することでこれを行い、サーバー側クライアント(node-amqp)でreplyToヘッダーが正しく設定されていることを確認しました(例:replyTo:'/ reply -queue / amq.gen-w2jykNGp4DNDBADm3C4Cdx')。まだサーバー側のクライアントで、「/ reply-queue/amq.gen-w2jykNGp4DNDBADm3C4Cdx」にメッセージを公開するだけでメッセージに返信できます。

ただし、RPC呼び出しが開始されたクライアントコードでこの応答を取得するにはどうすればよいですか?ドキュメントには、「SENDおよびSUBSCRIBEフレームに/ temp-queue宛先(...)を含めることはできません。応答キューへのサブスクリプションは自動的に作成されます」と記載されています。

では、どうすれば返信先キューにサブスクライブできますか?RPC呼び出しの結果を取得するにはどうすればよいですか?

前もって感謝します。

4

3 に答える 3

6

答えは次のとおりです。

サーバーワーカーでrpc呼び出しを受信すると、ヘッダーreplyToを取得します。そのヘッダーは次のようになります。

replyTo: '/reply-queue/[queue_name]'

例えば:replyTo:'/reply-queue/amqp.fe43gggr5g54g54ggfd_'

秘訣は次のとおりです。

  • あなたはそれを解析し、queue_nameに答えるだけです[例:amqp.fe43gggr5g54g54ggfd_]
  • デフォルトの交換に応答する必要があり、他の交換には応答しないでください

nodejsでの回答の例:

function onRpcReceived(message, headers, deliveryInfo, m) {
    var reply_to = m.replyTo.toString().substr(13, m.replyTo.toString().length);

    connection.publish(reply_to, {response:"OK", reply:"The time is 13h35m"}, {
                contentType:'application/json',
                contentEncoding:'utf-8',
                correlationId:m. correlationId
    });
}

ここで、web-stomp-pluginがキュー名だけを追加するのではなく、ヘッダーの属性「replyTo」に/reply-queue/文字列を追加するのはなぜだろうと思います。誰かが私が知りたい理由を知っているなら。

于 2012-09-25T21:58:28.790 に答える
1

元の質問への答え:

ただし、RPC呼び出しが開始されたクライアントコードでこの応答を取得するにはどうすればよいですか?ドキュメントには、「SENDおよびSUBSCRIBEフレームに/ temp-queue宛先(...)を含めることはできません。応答キューへのサブスクリプションは自動的に作成されます」と記載されています。

では、どうすれば返信先キューにサブスクライブできますか?RPC呼び出しの結果を取得するにはどうすればよいですか?

Rabbitは、現在のSTOMPセッションを一時キューに自動的にサブスクライブします。クライアントは一時キュー名を知らないため、サブスクライブできません。ただし、RabbitがSTOMP MESSAGEフレームを送信すると、サブスクリプションヘッダーが「reply-to」値(「/ temp-queue / foo」など)に設定されます。STOMP over WebSocketクライアントはこれを念頭に置いて作成されていませんが、サブスクリプションは次のように登録できます。

stompClient.subscriptions['/temp-queue/foo'] = function(message) {
  // ...
};

別の解決策があるかどうか聞いてうれしいです。

于 2013-05-29T21:47:37.420 に答える
0

注意: RabbitMQ 3.0.0以降、replyToに「/reply-queue/」はありません
。問題の原因を見つけるために約4時間を費やしました。.substring(13)の代わりに.replace('/ reply-queue /'、'')を使用してください!

于 2012-12-02T12:21:50.573 に答える