【问题标题】:Persist queue: serialize/deserialize queue object in node-amqp持久队列:在 node-amqp 中序列化/反序列化队列对象
【发布时间】:2014-03-04 16:26:57
【问题描述】:

我正在使用node-amqp 模块来管理rabbitmq 订阅。具体来说,我为每个用户/会话分配了一个独占/私有队列,并通过 REST 接口提供绑定方法。 IE。 “将我的队列绑定到这个 exchange/routing_key 对”,以及“取消绑定我的队列到这个 exchange/routing_key 对”。

这里的挑战是避免在内存中保留对队列对象的引用(例如,在具有模块范围的对象中)。

每次我需要时从连接中简单地检索队列本身是很困难的,因为队列对象在内部保持绑定标签,可能是为了避免违反the amqp 0.9.1 reference 中的以下内容:

客户端不得尝试解除绑定不存在的队列。错误代码:未找到

我尝试使用 connect-mongo 将队列对象简单地设置为会话对象的属性,因为它在其属性上使用 JSON.stringify/JSON.parse。不幸的是,由于循环结构,队列对象无法“字符串化”。

从 node-amqp 模块持久化队列对象的最佳实践是什么?是否可以序列化/反序列化?

【问题讨论】:

    标签: node.js persistence json-deserialization node-amqp


    【解决方案1】:

    我不会尝试存储队列对象,而是使用您可以存储的队列的唯一名称。之后,每当您想对队列进行操作时,您有两个选择:

    • 如果您之前打开了队列的“通道”,您应该可以这样做:

      queue = connection.queues[name]. 
      

      我的意思是连接作为针对 rabbitMQ 的 node-amqp 连接。

    • 如果您在与rabbitmq的连接中没有打开频道,只需再次打开频道:

      connection.queue(name = queueName, options, function(queue) {
          // for example do unbind
      })
      

    我也在使用 REST 接口来管理 rabbitMQ。我的连接对象维护着所有的队列、通道等……所以,只有在我第一次尝试使用我调用 connection.queue 的队列时,下面的请求才通过 connection.queues 检索队列。

    【讨论】:

    • 谢谢。该答案的相关部分是第一部分,因为我已经在原始问题中解释了第二部分的问题。我不知道使用 connection.queues[name] 的可能性,但这肯定解决了它:-)
    猜你喜欢
    • 2016-04-14
    • 1970-01-01
    • 1970-01-01
    • 2018-01-13
    • 1970-01-01
    • 2017-01-16
    • 1970-01-01
    • 2011-03-05
    • 2012-04-15
    相关资源
    最近更新 更多