Mar*_*tin 5 amqp rabbitmq pika
从我的生产者代码中,我想知道消费者何时basic.ack发出消息。
使用channel.confirm_delivery()和BlockingConnection从文档中尚不清楚这是否可以确认1)经纪人已收到消息,或2)消费者已确认收到消息。
运行以下代码(无使用方):
import pika
import uuid
# Open a connection to RabbitMQ on localhost using all default parameters
connection = pika.BlockingConnection()
# Open the channel
channel = connection.channel()
queue = str(uuid.uuid4())
# Declare the queue
channel.queue_declare(queue=queue)
# Turn on delivery confirmations
channel.confirm_delivery()
# Send a message
if channel.basic_publish(exchange='',
routing_key=queue,
body='Hello World!',
properties=pika.BasicProperties(
content_type='text/plain',
delivery_mode=1)):
print('Message publish was confirmed')
else:
print('Message could not be confirmed')
Run Code Online (Sandbox Code Playgroud)
显示要确认的消息。这不是我期望或想要的。
这可能与RabbitMQ在“确认”模式下的通道行为重复, 但是basic_publish的文档说
:returns:如果未启用交货确认,则为true(在pika 0.10.0中为NEW);否则,如果无法传递消息(Basic.nack和/或Basic.Return),则返回False;如果传递了消息,则返回True(Basic.ack而没有Basic.Return)
这让我认为它应该首先具有我想要的。
confirm_deliveries仅表示当RabbitMQ收到消息时,将返回basic.ack(收到消息)或basic.nack(未收到消息)。
但是,这不能保证邮件已成功传递到队列。您将需要为不可路由的消息添加强制性标志,以引发异常。
您可以在此处阅读有关确认交货和强制标志的更多信息。
回答您的问题;发布者无法知道使用者是否成功处理了该消息。但是,如果使用者无法使用消息,则应重新排队并由另一个使用者处理该消息,但这取决于使用者的设计水平。
如果您真的需要知道消息是否已正确处理,则实现RPC调用之类的方式来回复请求状态可能是最好的方法。如果您在X秒钟内未收到回复,则假定未处理该消息。 https://www.rabbitmq.com/tutorials/tutorial-six-python.html
如果您需要RPC发布者的异步示例,可以在这里查看我的flask示例。
| 归档时间: |
|
| 查看次数: |
2981 次 |
| 最近记录: |