2016-06-08 78 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