【问题标题】:Rabbitmq + web stomp plugin with rpc - reply-toRabbitmq + 带有 rpc 的 web stomp 插件 - 回复
【发布时间】:2012-09-16 03:59:20
【问题描述】:

我正在尝试使用 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 调用的结果?

提前致谢。

【问题讨论】:

    标签: rabbitmq rpc stomp


    【解决方案1】:

    答案是:

    当您在 server worker 中收到 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”而不是仅添加队列名称......!如果有人知道我想知道的原因。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

        原问题的答案:

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

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

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

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

        我很高兴知道是否有其他解决方案。

        【讨论】:

          猜你喜欢
          • 2016-11-15
          • 2015-05-26
          • 2016-06-04
          • 2016-10-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-05-03
          • 2019-05-08
          相关资源
          最近更新 更多