2016-06-08 14 views
3

Ich versuche zu meinem Hörer zu hören die Warteschlange nur 1 Nachricht nach dem ich meine Verbraucher sofort entfernen möchte. Wie kann ich das erreichen? Hier ist der Code.Entfernen Sie einen Verbraucher in RabbitMQ mit 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; 
    } 

in der obigen Queue ist die Warteschlange wird es hören und timeOut darstellt, wie lange meine Zuhörer hören werden. Wenn es eine Nachricht hört, möchte ich aufhören zu hören. Und zum weiteren Hören werde ich beim nächsten Mal die Funktion queueListner aufrufen. Obwohl ich conn.close() gemacht habe, aber auf der Benutzeroberfläche zeigt es immer noch Verbraucher. enter image description here

+0

können Sie Fragen Sie auch in der RabbitMQ-Benutzergruppe unter https://groups.google.com/forum/#!forum/rabbitmq-users nach, und überprüfen Sie die Versionshinweise auf behobene Fehler (falls Sie eine ältere Version verwenden) – mjn

+0

Ich habe gefragt https://groups.google.com/forum/#!topic/rabbitmq-users/VlSKLfSWT7g aber Wenn jemand eine Lösung hat, bitte teilen. – vkstack

Antwort

2

nicht verwenden consume. Wenn Sie nur eine einzige Nachricht erhalten müssen, verwenden Sie die get Methode

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

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

dies wird eine einzelne Nachricht aus der angegebenen Warteschlange abrufen und über die angegebene Message-Handler-Funktion ausführen

+0

Muss ich die Verbindung schließen, wenn ich die Methode get benutze. – vkstack

+1

ja. Die Verbindung ist getrennt von allem, was Sie auf dem Kanal tun. Sie müssen immer noch die Verbindung auf die gleiche Weise verwalten –

+0

Dank @Derick Das hat mir sehr geholfen. – vkstack