2016-06-08 197 views
3

我想让我的听众听到队列后只有1消息我想立即删除我的消费者。我怎样才能做到这一点。 这里是代码。删除消费者在RabbitMQ与nodeJS

queueListener:function(Queue,timeOut){ 
    var deferred=sails.promise.defer(),timer,data; 
    sails.amqp.connect('amqp://localhost', function(err, conn) { 
     conn.createConfirmChannel(function(err, ch) { 
     if(err){ 
      conn.close(); 
      deferred.reject(err); 
     }else{ 
      ch.assertQueue(Queue, {durable: true}); 
      ch.prefetch(1); 
      ch.consume(Queue,function(msg){ 
      data=msg.content.toString(); 
      clearTimeout(timer); 
      ch.ack(msg); 
      setTimeout(function(){ 
       conn.close(); 
       deferred.resolve(data); 
      },0); 
      },{noAck: false}); 
     } 
     }); 
     timer=setTimeout(function(){ 
     conn.close(); 
     deferred.reject(new Error("Nothing in the Queue.")); 
     },timeOut-5); 
    }); 
    return deferred.promise; 
    } 
在上述 队列

是将监听的队列和超时表示多久我的听众会听。 如果它侦听一条消息,我想停止监听。并且为了进一步侦听,我将在下次调用函数queueListner。 虽然我做了conn.close(),但在用户界面上它仍然显示消费者。 enter image description here

+0

你可以请访问https://groups.google.com/forum/#!forum/rabbitmq-users上的RabbitMQ用户组,查看发布说明以了解修正的错误(如果您使用的是旧版本) – mjn

+0

我已经询问https://groups.google.com/forum/#!topic/rabbitmq-users/VlSKlfSWT7g 但如果有人有解决方案,请分享。 – vkstack

回答

2

不使用consume。如果你只需要得到一个消息,使用get方法

http://www.squaremobius.net/amqp.node/channel_api.html#channel_get

ch.get("queue-name").then(messageHandlerFunction) 

这会从指定的队列中检索单个消息,并通过指定的消息处理函数运行

+0

如果我使用get方法,我需要关闭连接吗? – vkstack

+1

是的。该连接与您在频道上执行的任何操作都是分开的。你仍然需要以同样的方式管理连接 –

+0

谢谢@Derick 这对我有很大的帮助。 – vkstack