【问题标题】:How to ensure that messages get delivered?如何确保消息送达?
【发布时间】:2013-06-17 22:34:56
【问题描述】:

您如何确保使用Pika 传递消息?默认情况下,如果消息未成功传递,它不会向您提供错误。

在此示例中,可以在 pika 确认连接已断开之前发送几条消息。

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

【问题讨论】:

    标签: python rabbitmq message pika


    【解决方案1】:

    使用Pika 时,需要在开始发布消息之前设置channel.confirm_delivery() 标志。这很重要,这样 Pika 将在发送下一条消息之前确认每条消息都已成功发送。但是,这会增加向RabbitMQ 发送消息所需的时间,因为在程序可以继续处理下一条消息之前需要确认发送。

    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 将返回Boolean,具体取决于消息是否已发送。但是,如果连接在传输过程中关闭并适当地处理它,捕获潜在的异常是很重要的。在那些情况下,异常会中断程序的流程。

    【讨论】:

    • 只是出于好奇,是否需要 BlockingConnection() 才能调用 channel.confirm_delivery() ?
    • @Jeffrey04:所有连接类型都应该支持它,因为它在基本通道对象中定义。 github.com/pika/pika/blob/…
    【解决方案2】:

    在尝试自己并没有收到除 ack 以外的其他信息后, 我决定直接回复发件人。

    我按照here给出的示例进行操作

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-08-25
      • 2021-08-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-31
      • 2021-09-10
      相关资源
      最近更新 更多