2013-06-20 19 views
6

Wie stellen Sie sicher, dass Nachrichten mit Pika geliefert werden? Standardmäßig wird Ihnen kein Fehler angezeigt, wenn die Nachricht nicht erfolgreich zugestellt wurde.Wie kann sichergestellt werden, dass Nachrichten zugestellt werden?

In diesem Beispiel können mehrere Nachrichten gesendet werden, bevor Pika bestätigt, dass die Verbindung unterbrochen wurde.

import pika 

connection = pika.BlockingConnection(pika.ConnectionParameters(
     host='localhost')) 
channel = connection.channel() 
channel.queue_declare(queue='hello') 
for index in xrange(10): 
    channel.basic_publish(exchange='', routing_key='hello', 
          body='Hello World #%s!' % index) 
    print('Total Messages Sent: %s' % x) 
connection.close() 

Antwort

10

Bei der Verwendung von Pika die channel.confirm_delivery() Flag gesetzt werden muss, bevor Sie veröffentlichen Nachrichten beginnen. Dies ist wichtig, damit Pika bestätigen kann, dass jede Nachricht erfolgreich gesendet wurde, bevor die nächste Nachricht gesendet wird. Dies erhöht jedoch die Zeit, die zum Senden von Nachrichten an RabbitMQ benötigt wird, da die Zustellung bestätigt werden muss, bevor das Programm mit der nächsten Nachricht fortfahren kann.

channel.confirm_delivery() 

try: 
    for index in xrange(10): 
     channel.basic_publish(exchange='', routing_key='hello', 
           body='Hello World #%s!' % index) 
     print('Total Messages Sent: %s' % x) 
except pika.exceptions.ConnectionClosed as exc: 
    print('Error. Connection closed, and the message was never delivered.') 

basic_publish ein Boolean je zurück, wenn die Nachricht gesendet wurde oder nicht. Es ist jedoch wichtig, potenzielle Ausnahmen zu erfassen, falls die Verbindung während der Übertragung geschlossen wird, und sie entsprechend zu behandeln. In diesen Fällen unterbricht die Ausnahme den Ablauf des Programms.

+0

Nur aus Neugier, ist BlockingConnection() erforderlich, um channel.confirm_delivery() aufzurufen? – Jeffrey04

+1

@ Jeffrey04: Es sollte in allen Verbindungstypen unterstützt werden, wie es im Basiskanalobjekt definiert ist. https://github.com/pika/pika/blob/f8c263f234cca6b0f573ac63268a4034e32bd3eb/pika/channel.py#L388 – eandersson

+0

danke für die Klarstellung (: – Jeffrey04

Verwandte Themen