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

时间:2011-03-27 11:30:30

标签: python rabbitmq amqp

我有一些问题让Pika以与AMQP或RabbitMQ文档一致的方式处理路由密钥或交换。我知道RabbitMQ文档使用旧版本的Pika,所以我忽略了他们的示例代码。

我要做的是定义一个队列," order"并有两个消费者,一个处理交换或路由_key"生产"和一个处理"测试"。通过使用直接交换和路由密钥或使用主题交换来查看RabbitMQ文档应该很容易。

然而,Pika似乎并不知道如何处理交换和路由密钥。使用RabbitMQ管理工具检查队列,很明显,Pika要么没有正确排队消息,要么RabbitMQ只是把它扔掉了。

在消费者方面,我并不清楚我应该如何将消费者绑定到交易所或处理路由密钥,而且文档并没有真正帮助。

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

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

1 个答案:

答案 0 :(得分:11)

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

这个想法如下:

<强>客户端

获取连接后的客户端不应该关心除交换机名称和路由密钥之外的任何其他内容。那就是我们不知道最终会出现哪个队列。

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”回调是个好地方,我们可以使用我们想要的路由键将队列绑定到交换机。

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”发送到“订单”交换的消息现在将被路由到“测试”队列,消费者可以在其中获取它。