如何使用Pika发送和接收RabbitMQ消息?

2024-05-14 00:34:16 发布

您现在位置:Python中文网/ 问答频道 /正文

我在让Pika使用路由密钥或交换时遇到了一些问题,这与它的AMQP或RabbitMQ文档是一致的。我知道RabbitMQ文档使用了较旧版本的Pika,所以我忽略了它们的示例代码。

我要做的是定义一个队列“order”,并有两个消费者,一个负责处理交换或路由密钥“production”,另一个负责处理“test”。通过查看RabbitMQ文档,可以很容易地使用直接交换和路由密钥,或者使用主题交换。

然而,Pika似乎不知道如何处理交换和路由密钥。使用RabbitMQ管理工具检查队列,很明显Pika要么没有正确地对消息进行排队,要么RabbitMQ只是将其丢弃。

在使用者方面,我不太清楚应该如何将使用者绑定到exchange或处理路由密钥,文档也没有真正的帮助。

如果我放弃所有想法或交换和路由密钥,消息会很好地排队,并且很容易被我的消费者处理。

任何指针或示例代码的人都会很好。


Tags: 代码文档test消息示例amqp定义队列
1条回答
网友
1楼 · 发布于 2024-05-14 00:34:16

事实证明,我对AMQP的理解是不完整的。

其思路如下:

客户

获取连接后的客户端不应关心其他任何事情,而应关心exchange的名称和路由密钥。那就是我们不知道这最后会排在哪个队。

channel.basic_publish(exchange='order',
                      routing_key="order.test.customer",
                      body=pickle.dumps(data),
                      properties=pika.BasicProperties(
                          content_type="text/plain",
                          delivery_mode=2))

消费者

当通道打开时,我们声明交换和队列

channel.exchange_declare(exchange='order', 
                         type="topic", 
                         durable=True, 
                         auto_delete=False)

channel.queue_declare(queue="test", 
                      durable=True, 
                      exclusive=False, 
                      auto_delete=False, 
                      callback=on_queue_declared)

当队列准备就绪时,在“on_queue_declared”回调是一个好地方,我们可以使用所需的路由密钥将队列绑定到exchange。

channel.queue_bind(queue='test', 
                   exchange='order', 
                   routing_key='order.test.customer')

#handle_delivery is the callback that will actually pickup and handle messages
#from the "test" queue
channel.basic_consume(handle_delivery, queue='test') 

使用路由密钥“order.test.customer”发送到“order”交换的消息现在将被路由到“test”队列,在该队列中,消费者可以提取它。

相关问题 更多 >