rabbitmq

时间:2015-08-27 17:13:05

标签: javascript node.js rabbitmq

我正在使用amqp.node并且我想设置一个系统,无论队列中有多少消息,它每秒都会从队列中检索1条消息。我想通过频道检查i get之前的队列大小。我该怎么做?

consumer.js

#!/usr/bin/env node

var amqp = require('amqplib/callback_api')
amqp.connect('<my_rabbitmq_host_info>', function(err, conn){
  conn.createChannel(function(err, ch){
    var q = 'message-queue'
    ch.assertQueue(q, {durable: false}, function(err, queue){
      console.log(' [*] waiting for messages in queue: %s -- to exit press ctrl+c', q)

      setInterval(function(){
       getMessage(ch, q, queue)
      }, 1000)
    })
  })
})

function getMessage(ch, q, queue){
  if( !queue ){
    return
  }

  console.log('queue %s has %d messages in it...', q, queue.messageCount)
  if( queue.messageCount > 0 ){
    console.log('getting 1 message from queue')
    ch.get(q, {noAck: false}, function(err, msg){
      console.log(' [x] message recieved: %s \n\n', msg.content.toString())
      ch.ack(msg)
    })
  }
}

我每次我假设时获得queue.messageCount的相同数字,因为我每次都会向该函数发送相同的queue实例。我如何获得当前 queue.messageCount

1 个答案:

答案 0 :(得分:1)

每次想要获得当前大小时,您必须再次拨打assertQueue。反转你的代码,这样你就可以在每个间隔超时时调用它,而不是只调用一次。


setInterval(function(){

  ch.assertQueue(q, {durable: false}, function(err, queue){
    console.log(' [*] waiting for messages in queue: %s -- to exit press ctrl+c', q)
    getMessage(ch, q, queue)
  });

}, 1000)

也 - 这对我来说似乎是一个坏主意。我建议采用不同的方法。为消费者设置the prefetch limit为1。那么你的代码一次只能拉一条消息。

另外,这可能会有所帮助:http://dougbarth.github.io/2011/06/10/keeping-the-rabbit-on-a-leash.html - 不同的语言,但概念应转换为节点