簡體   English   中英

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

[英]How can I use Pika to send and receive RabbitMQ messages?

我在讓 Pika 以與 AMQP 或 RabbitMQ 文檔一致的方式使用路由密鑰或交換時遇到了一些問題。 我知道 RabbitMQ 文檔使用舊版本的 Pika,所以我忽略了他們的示例代碼。

我想要做的是定義一個隊列,“訂單”並有兩個消費者,一個處理交換或 routing_key“生產”,一個處理“測試”。 通過查看 RabbitMQ 文檔,通過使用直接交換和路由鍵或使用主題交換應該很容易做到。

然而,Pika 似乎不知道如何處理交換和路由密鑰。 使用 RabbitMQ 管理工具檢查隊列,很明顯 Pika 沒有正確地對消息進行排隊,或者 RabbitMQ 只是將其丟棄。

在消費者方面,我並不清楚我應該如何將消費者綁定到交換或處理路由密鑰,並且文檔並沒有真正幫助。

如果我放棄所有的想法或交換和路由鍵,消息會很好地排隊並且很容易被我的消費者處理。

人們擁有的任何指針或示例代碼都會很好。

事實證明,我對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”發送到“訂單”交換的消息現在將被路由到“測試”隊列,消費者可以在其中獲取它。

雖然 Simon 的回答一般來說似乎是正確的,但您可能需要交換參數以進行消費

channel.basic_consume(queue='test', on_message_callback=handle_delivery) 

基本設置就像

credentials = pika.PlainCredentials("some_user", "some_password")
parameters = pika.ConnectionParameters(
    "some_host.domain.tld", 5672, "some_vhost", credentials
)
connection = pika.BlockingConnection(parameters)
channel = connection.channel()

開始消費:

channel.start_consuming()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM