2011-03-27 325 views
4

我有一些問題讓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

回答

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」現在將被路由到「測試」隊列,其中消費者可以把它撿起來。