2013-06-20 20 views
6

Come ci si assicura che i messaggi vengano consegnati con Pika? Di default non ti fornirà un errore se il messaggio non è stato consegnato con successo.Come garantire che i messaggi vengano consegnati?

In questo esempio, è possibile inviare diversi messaggi prima che Pika riconosca che la connessione era inattiva.

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() 

risposta

10

Quando si utilizza il flag Pikachannel.confirm_delivery() deve essere impostata prima di iniziare la pubblicazione di messaggi. Questo è importante in modo che Pika confermi che ogni messaggio è stato inviato con successo prima di inviare il messaggio successivo. Ciò tuttavia aumenterà il tempo necessario per inviare i messaggi a RabbitMQ, poiché la consegna deve essere confermata prima che il programma possa procedere con il messaggio successivo.

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 restituirà un Boolean a seconda se il messaggio è stato inviato o meno. Tuttavia, è importante rilevare le potenziali eccezioni nel caso in cui la connessione venga chiusa durante il trasferimento e gestirla in modo appropriato. Come in quei casi, l'eccezione interromperà il flusso del programma.

+0

solo per curiosità, è necessario BlockingConnection() per chiamare channel.confirm_delivery()? – Jeffrey04

+1

@ Jeffrey04: deve essere supportato in tutti i tipi di connessione, poiché è definito nell'oggetto del canale di base. https://github.com/pika/pika/blob/f8c263f234cca6b0f573ac63268a4034e32bd3eb/pika/channel.py#L388 – eandersson

+0

grazie per il chiarimento (: – Jeffrey04

Problemi correlati