[英]Acknowledge messages with pika for RabbitMQ
我正在使用 RabbitMQ 在不同的 docker 容器之间进行消息交换。 在客户端,我使用 pika 与 RabbitMQ 进行通信。 现在出现了以下问题:
使用 BlockingConnection 我在我的消费者中收到一条消息,该消息触发了一项非常耗时的任务。 在此任务的处理过程中,RabbitMQ 关闭了连接,因为心跳没有从消费连接发送,因为它正忙于处理任务。
我想出的解决方案是在将回调附加到消费者队列时关闭 pika 中的自动确认,例如channel.basic_consume(queue='myqueue', on_message_callback=my_callback, auto_ack=False)
。 此外,我将耗时的处理移至守护进程的 Python 线程,以允许 BlockingConnection 发送 RabbitMQ 所需的心跳。
现在我需要在处理完成后确认来自线程的 RabbitMQ 消息。 为此,我从method
提取了delivery_tag
,并从 pika 提供的channel
属性中提取了channel_number
。
channel_number = channel.channel_number
delivery_tag = method.delivery_tag
现在在线程中我创建了一个新连接,因为 pika 不是线程安全的
conn = BlockingConnection(ConnectionParameters(host="rabbitmq"))
channel = conn.channel(channel_number=channel_number)
channel.queue_declare(queue='myqueue', durable=False)
channel.basic_ack(delivery_tag=delivery_tag)
conn.close()
确认消息。
但是,确认不起作用,因为 pika 会产生以下警告:
WARNING:pika.channel:Received remote Channel.Close (406): 'PRECONDITION_FAILED - unknown delivery tag 1' on <Channel number=1 CLOSING conn=<SelectConnection OPEN transport=<pika.adapters.utils.io_services_utils._AsyncPlaintextTransport object at 0x7f94f1dad9e8> params=<ConnectionParameters host=rabbitmq port=5672 virtual_host=/ ssl=False>>>
WARNING:pika.adapters.blocking_connection:Got ChannelClosed while closing channel from connection.close: ChannelClosedByBroker: (406) 'PRECONDITION_FAILED - unknown delivery tag 1'
Q1:是否可以确认连接 A 收到的来自连接 B 的消息?
Q2:知道为什么这不起作用吗?
使用此示例后的add_callback_threadsafe
函数解决了该add_callback_threadsafe
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.