首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Rabbitmq + web stomp插件,带rpc - reply-to

Rabbitmq + web stomp插件,带rpc - reply-to
EN

Stack Overflow用户
提问于 2012-09-25 00:41:44
回答 3查看 2.6K关注 0票数 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调用的客户机代码中获得此回复?文档声明“发送和订阅帧不能包含/temp-queue目的地(...)对回复队列的订阅是自动创建的。”

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

提前谢谢。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-09-26 05:58:29

答案是:

当您在服务器工作器中接收到rpc调用时,您将获得头replyTo。该标头类似于:

代码语言:javascript
复制
replyTo: '/reply-queue/[queue_name]'

例如:replyTo:'/reply-queue/amqp.fe43gggr5g54g54ggfd_'

诀窍是:

amqp.fe43gggr5g54g54ggfd_

  • You
  • 你必须解析它,并且只回答queue_name例如:
    • 必须回答默认交换,而不是任何其他交换

nodejs中的答案示例:

代码语言:javascript
复制
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“属性中,而不是只添加队列名称....!如果有人知道原因,我很想知道。

票数 6
EN

Stack Overflow用户

发布于 2013-05-30 05:47:37

原问题的答案如下:

然而,我如何在发起

调用的客户机代码中获得此回复?文档声明“发送和订阅帧不能包含/temp-queue目的地(...)对回复队列的订阅是自动创建的。”

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

Rabbit自动将当前STOMP会话订阅到temp队列。客户端不知道临时队列名称,因此无法订阅它。然而,当Rabbit发送STOMP消息帧时,它会将订阅标头设置为"reply- to“值(例如"/temp-queue/foo")。尽管在编写WebSocket客户端时没有考虑到这一点,但可以按如下方式注册订阅:

代码语言:javascript
复制
stompClient.subscriptions['/temp-queue/foo'] = function(message) {
  // ...
};

如果有其他解决方案,我会很高兴听到的。

票数 1
EN

Stack Overflow用户

发布于 2012-12-02 20:21:51

NB:自RabbitMQ 3.0.0以来,replyTo中不再有'/reply-queue/‘

我花了大约4个小时来找出问题所在。用.replace('/reply-queue/','')代替.substring(13)!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12569324

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档