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

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

问题描述:

我有一些问题让Pika以与AMQP或RabbitMQ文档一致的方式使用路由密钥或交换。我知道RabbitMQ文档使用较旧版本的Pika,所以我忽略了他们的示例代码。如何使用Pika发送和接收RabbitMQ消息?

我想要做的是定义一个队列“订单”,并有两个消费者,一个处理交换或routing_key“生产”和一个处理“测试”。从查看RabbitMQ文档,通过使用直接交换和路由密钥或使用主题交换,这些文档应该很容易完成。

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

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

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

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

+1

无效的问题:我从来没有看到任何标准的完成实施。他们总是缺乏实施细节。 – 2011-03-27 11:40:35

+0

“文档使用较旧版本的Pika,所以我忽略了他们的示例代码。”这是一个真正的问题,影响到许多尝试从官方rabbitMQ网站上手(pika)的人。我甚至克隆了他们的示例代码,并试图运行它们(安装rabbitMQ服务器并且没有SELinux问题),但没有获得预期的结果。 – Andreas 2014-12-25 16:55:04

事实证明,我对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”现在将被路由到“测试”队列,其中消费者可以把它捡起来。