带有rpc的Rabbitmq + web stomp插件 - 回复

whi*_*rue 3 rpc stomp rabbitmq

我正在尝试使用RabbitMQ的STOMP适配器执行RPC.作为客户端库我正在使用STOMP over WebSocket(https://github.com/jmesnil/stomp-websocket/)库.

从文档(http://www.rabbitmq.com/stomp.html#d.tqd)我看到我必须设置回复标题.我通过指定类似"reply-to:/ temp-queue/foo"的方式完成了这一点,我在服务器端客户端(node-amqp)中看到replyTo标头设置正确(例如:replyTo:'/ reply -queue/amq.gen-w2jykNGp4DNDBADm3C4Cdx').仍然在我的服务器端客户端,我可以通过向"/reply-queue/amq.gen-w2jykNGp4DNDBADm3C4Cdx"发布消息来回复该消息.

但是,如何在启动RPC调用的客户端代码中获得此回复?文档声明"SEND和SUBSCRIBE帧不得包含/ temp-queue destination(...)自动创建对回复队列的订阅."

那么,我如何订阅回复队列?如何获得RPC调用的结果?

提前致谢.

whi*_*rue 6

答案是:

当您在服务器工作程序中收到rpc调用时,您将获得标题replyTo.标题如下:

replyTo: '/reply-queue/[queue_name]'
Run Code Online (Sandbox Code Playgroud)

例如: 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
    });
}
Run Code Online (Sandbox Code Playgroud)

现在我只想知道为什么web-stomp-plugin将/ reply-queue/string添加到标题上的"replyTo"属性而不是只添加队列名.... 如果有人知道我想知道的原因.