2017-09-12 3 views
0

Ich habe eine Aufgabe, in der ich versuche, alle Nachrichten in einer Kaninchen-Warteschlange zu bekommen. Ich muss nur GET, und nicht konsumieren. hier So ist der Code, ich bin mitVersuchen, Kaninchen-Nachricht ohne ack, aber keinen Erfolg zu bekommen

def some_function_name() : 
    connection = rabbitObj.get_connection() 
    channel = rabbitObj.get_channel(connection) 
    while True : 
     method_frame, header_frame, body = channel.basic_get(queue='error_queue', no_ack=False) 
     if method_frame: 
      #do some work 
     else : 
      break #breaking the loop 

while(True): 
    some_function_name() 

, wenn ich diesen Code ausführen, funktioniert es richtig, zuerst time.I alle Nachrichten in der Warteschlange erhalten und und alle Nachrichten bleiben in ‚Bereit‘ Zustand, aber wenn Ich führe die Schleife zum zweiten Mal durch, alle Nachrichten schalten die Änderung in den Status 'Unbestätigt' um.

Anforderung: Jedes Mal sollte ich nur Nachrichten bekommen, und sie sollten nicht unbestätigt gehen.

erste Schleife:

First Loop

zweite Schleife:

enter image description here

Kann mir jemand helfen mit, was ich falsch mache, oder welche Veränderungen soll ich machen.

Vielen Dank im Voraus :)

Edit 1: Was @BarrensZeppelin ‚s Antwort, werden alle msgs verloren, wenn ich no_ack = True gesetzt. Überprüfen Sie den folgenden Screenshot: enter image description here

Antwort

0

Ich habe einen Workaround, und es funktioniert. das Kaninchen Verbindung Schließen, nachdem der Trick raubend.

def some_function_name() : 
    connection = rabbitObj.get_connection() 
    channel = rabbitObj.get_channel(connection) 
    while True : 
     method_frame, header_frame, body = channel.basic_get(queue='error_queue', no_ack=False) 
     if method_frame: 
      #do some work 
     else : 
      break #breaking the loop 
    rabbitObj.close_connection(connection) 

while(True): 
    some_function_name() 
+0

Sie könnten stattdessen basic_cancel verwenden, damit Sie dieselbe Verbindung verwenden können. – BarrensZeppelin

0

Wenn Sie no_ack=False setzen, sagen Sie speziell dem Broker, eine Antwort zu erwarten, weshalb alle Nachrichten unbestätigt werden. Versuchen Sie die Einstellung no_ack=True.

+0

In diesem Fall werden alle Nachrichten verloren gehen (obwohl jetzt ist es Zeit, eine Verbindung jedes Mal zu erstellen nehmen und schließen). Einen Screenshot für diesen Fall hinzufügen – kadamb

+0

Aha, also wollen Sie die Warteschlange durchsuchen. Dies wird in RabbitMQ nicht unterstützt, aber es gibt Workarounds. Werfen Sie einen Blick auf diese Frage: https://stackoverflow.com/questions/4700292/using-rabbitmq-is-there-a-way-to-look-at-the-queue-contents-without-a-dequeue – BarrensZeppelin

+0

Ich frage mich auch, warum es in der ersten Runde funktioniert? – kadamb

Verwandte Themen