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

Rabbitmq+;带有rpc的web stomp插件-回复,rabbitmq,rpc,stomp,Rabbitmq,Rpc,Stomp,我正在尝试使用RabbitMQ的STOMP适配器执行RPC。作为客户端库,我使用的是STOMP over WebSocket(https://github.com/jmesnil/stomp-websocket/)图书馆 从文件中(http://www.rabbitmq.com/stomp.html#d.tqd)我看到我必须将回复设置为header。通过指定类似“reply to:/temp queue/foo”的内容,我在服务器端客户端(节点amqp)中看到replyTo头设置正确(例如:re

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

从文件中(http://www.rabbitmq.com/stomp.html#d.tqd)我看到我必须将回复设置为header。通过指定类似“reply to:/temp queue/foo”的内容,我在服务器端客户端(节点amqp)中看到replyTo头设置正确(例如:replyTo:“/reply queue/amq.gen-w2jykgp4dndbadm3c4cdx”)。仍然在我的服务器端客户端中,我可以通过将消息发布到“/reply queue/amq.gen-w2jykgp4dndbadm3c4cdx”来回复消息

但是,如何在启动RPC调用的客户端代码中获得此回复?文档说明“发送和订阅帧不得包含/temp队列目标(…)将自动创建对回复队列的订阅。”

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

提前感谢。

答案是:

当您在服务器工作进程中接收到rpc调用时,您会得到replyTo头。该标题如下所示:

replyTo: '/reply-queue/[queue_name]'
例如:
replyTo:'/reply queue/amqp.fe43gggr5g54g54ggfd'

诀窍是:

  • 您必须对其进行解析并只回答队列名称[例如:
    amqp.fe43gggr5g54gggfd.
    ]
  • 您必须回答默认的交换,而不是任何其他交换
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插件会将/reply queue/string添加到头上的属性“replyTo”中,而不是只添加队列名称。。。。!如果有人知道我想知道的原因。

NB:自RabbitMQ 3.0.0以来,replyTo中不再有“/reply queue/”

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

原问题的答案是:

但是,如何在RPC所在的客户端代码中获得此回复 电话启动了吗?文档说明“发送和订阅” 帧不能包含/temp队列目标(…)订阅 要答复,将自动创建队列。“

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

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

stompClient.subscriptions['/temp-queue/foo'] = function(message) {
  // ...
};
我很高兴听到是否有其他解决办法