我正在尝试使用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调用的结果?
提前谢谢。
发布于 2012-09-26 05:58:29
答案是:
当您在服务器工作器中接收到rpc调用时,您将获得头replyTo。该标头类似于:
replyTo: '/reply-queue/[queue_name]'例如:replyTo:'/reply-queue/amqp.fe43gggr5g54g54ggfd_'
诀窍是:
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“属性中,而不是只添加队列名称....!如果有人知道原因,我很想知道。
发布于 2013-05-30 05:47:37
原问题的答案如下:
然而,我如何在发起
调用的客户机代码中获得此回复?文档声明“发送和订阅帧不能包含/temp-queue目的地(...)对回复队列的订阅是自动创建的。”
那么,我如何订阅回复队列呢?如何获得RPC调用的结果?
Rabbit自动将当前STOMP会话订阅到temp队列。客户端不知道临时队列名称,因此无法订阅它。然而,当Rabbit发送STOMP消息帧时,它会将订阅标头设置为"reply- to“值(例如"/temp-queue/foo")。尽管在编写WebSocket客户端时没有考虑到这一点,但可以按如下方式注册订阅:
stompClient.subscriptions['/temp-queue/foo'] = function(message) {
// ...
};如果有其他解决方案,我会很高兴听到的。
发布于 2012-12-02 20:21:51
NB:自RabbitMQ 3.0.0以来,replyTo中不再有'/reply-queue/‘
我花了大约4个小时来找出问题所在。用.replace('/reply-queue/','')代替.substring(13)!
https://stackoverflow.com/questions/12569324
复制相似问题