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

时间:2012-09-24 16:41:44

标签: rabbitmq rpc stomp

我正在尝试使用RabbitMQ的STOMP适配器执行RPC。作为客户端lib,我正在使用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调用的结果?

提前致谢。

3 个答案:

答案 0 :(得分: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将/ reply-queue / string添加到标题上的“replyTo”属性而不是仅添加队列名....如果有人知道我想知道的原因。

答案 1 :(得分:1)

原始问题的答案:

  

但是,如何在我的RPC客户端代码中获得此回复   电话是否已启动?文档说明了“SEND和SUBSCRIBE”   帧不得包含/ temp-queue destination(...)订阅   回复队列是自动创建的。“

     

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

Rabbit会自动将当前STOMP会话订阅到临时队列。客户端不知道临时队列名称,也无法订阅它。但是,当Rabbit发送STOMP MESSAGE帧时,它将订阅标头设置为“reply-to”值(例如“/ temp-queue / foo”)。尽管STOMP over WebSocket客户端并未考虑到这一点,但订阅可以注册如下:

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

我很高兴听到是否有另一种解决方案。

答案 2 :(得分:0)

NB:自RabbitMQ 3.0.0起,回复中没有'/ reply-queue /'了 我花了大约4个小时来找出问题所在。使用.replace('/ reply-queue /','')代替.substring(13)!