3

我正在尝试使用 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 目标 (...) 对回复队列的订阅是自动创建的。”

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

提前致谢。

4

3 回答 3

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/ 字符串添加到标题上的属性“replyTo”而不是只添加队列名称......!如果有人知道我想知道的原因。

于 2012-09-25T21:58:28.790 回答
1

原始问题的答案:

但是,如何在发起 RPC 调用的客户端代码中得到这个回复?文档指出“SEND 和 SUBSCRIBE 帧不得包含 /temp-queue 目标 (...) 对回复队列的订阅是自动创建的。”

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

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

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

我很高兴听到是否有其他解决方案。

于 2013-05-29T21:47:37.420 回答
0

注意:自 RabbitMQ 3.0.0 以来,replyTo 中不再有“/reply-queue/”
我花了大约 4 个小时来找出问题所在。使用 .replace('/reply-queue/', '') 代替 .substring(13)!

于 2012-12-02T12:21:50.573 回答