持久队列:在node-amqp中序列化/反序列化队列对象

时间:2014-03-04 16:26:58

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

我正在使用node-amqp模块来管理rabbitmq订阅。具体来说,我正在为每个用户/会话分配一个专用/私有队列,并通过REST接口提供绑定方法。即“将我的队列绑定到此exchange / routing_key对”,并“将我的队列解除绑定到此exchange / routing_key对”。

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

每次我需要时,只需从连接中检索队列本身就很困难,因为队列对象会在内部监视绑定,可能是为了避免违反the amqp 0.9.1 reference中的以下内容:

  

客户端绝不能尝试取消绑定不存在的队列。错误代码:未找到

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

从node-amqp模块中保留队列对象的最佳做法是什么?是否可以序列化/反序列化?

1 个答案:

答案 0 :(得分:0)

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

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

    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检索队列。