2012-06-21 74 views
6

我是RabbitMQ的新手,並對我正在考慮的這個問題的一個很好的方法感到好奇。我想創建一個服務,訂閱一個隊列,並只提取符合特定條件的消息;例如,如果特定主題標題在消息中。RabbitMQ--選擇性地從隊列中檢索郵件

我還在學習RabbitMQ,並且正在尋找如何解決這個問題的提示。我的問題包括:消費者如何才能從隊列中抽取特定消息?生產者如何在消息中設置主題頭(如果這甚至是正確的術語?)

+0

如果真的是你的消費者有權認購** **(在被公佈_before_訂閱郵件不感興趣),認購(與選擇規則結合)不是針對現有的_queue_,而是針對現有的_exchange_(如下面的回答)。然後,應該編輯問題的措詞。 – Myobis

回答

14

RabbitMQ非常適合這種情況。你有很多選擇去做你想做的事。我建議閱讀文檔以獲得更好的理解。我建議你使用主題或直接交換。主題更加靈活。它是這樣的。

生產者代碼連接到RabbitMQ Broker,並使用特定名稱創建和交換。

製作者發佈交換。發佈的每條消息都將使用路由鍵發佈。

消費者連接到RabbitMQ經紀人。

消費者創建隊列

消費者結合隊列到交換,在生產者定義的相同交換。該綁定還包括用於該特定消費者的每個消息所需的路由密鑰。

可以說你正在發佈日誌消息。路由密鑰可能類似於「log.info」,「log.warn」,「log.error」。生產者發佈的每條消息都會附加相關的路由密鑰。然後,您將有一位消費者發送併發送所有錯誤消息的電子郵件,另一位將所有錯誤消息寫入文件。因此,電子郵件發件人將使用路由鍵「log.error」定義從其隊列到交換機的綁定。通過這種方式,雖然交換機接收到所有消息,但爲電子郵件程序定義的隊列將僅包含錯誤消息。文件記錄器將定義綁定到同一個交換機的新的單獨隊列並設置不同的路由密鑰。您可以爲三個不同的路由密鑰需要三個單獨的綁定,或者只需使用通配符「log。*」來從交換機向log請求所有消息。

這是一個簡單的例子,展示了你如何實現你想要做的事情。

here代碼示例具體人數教程5號

+0

你的意思是消費者可以在一個隊列中檢索具有特定路由密鑰的消息嗎?它看起來像消費者沒有選擇,它只是接收隊列中的所有消息。 – ThemeZ

+2

@ThemeZ消費者從隊列中接收所有消息。我認爲這是根據定義。這裏的要點是,它們在交易所層面被過濾。通過話題交換,隊列只會收到某些消息。這樣消費者就可以讀取他們想要的消息,因爲隊列只接收消費者想要的消息。 – robthewolf