歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> RabbitMQ - Publish/Subscribe in Java

RabbitMQ - Publish/Subscribe in Java

日期:2017/3/1 9:41:16   编辑:Linux編程

這次我們試試publish / subscribe模式,
也就是將一個消息發送給多個consumer。

這裡用一個簡單的小程序來說明publish / subscribe。
由一個provider提供消息,這個消息會被多個consumer接收。
consumer對同一個消息做出不同的反應,比如打印、保存到文件、數據庫什麼的。

之前的例子可能會給人這種感覺:
producer將消息發送到隊列中,消息緩沖在隊列中,consumer從隊列獲得消息。

但這並不正確。
在rabbit中,producer從來不會直接將消息發送到隊列中。
producer根本無從得知消息是否會發送到某個隊列中。

事實上,producer只能將消息發送到exchange中。
這麼一說雖然感覺多了個東西,但exchange並不復雜。
exchange只是從producer獲取消息並將消息推送到隊列中。

但為什麼多了這麼個步驟?
比如exchange收到消息後,它應該將消息推送給某個特定的隊列? 或者可以將消息推送給多個隊列? 再或者直接拋棄該消息?
這些規則取決於exchange的類型。

以下是一些可用的exchange type(org.springframework.amqp.core.ExchangeTypes):

public static final String DIRECT = "direct"; public static final String TOPIC = "topic"; public static final String FANOUT = "fanout"; public static final String HEADERS = "headers"; public static final String SYSTEM = "system";

我們可以用以下方式定義一個exchange:

channel.exchangeDeclare("logs", "fanout");

正如其名,fanout就是將收到的消息發送給所有可訪問的隊列。

如何查看已定義的exchange?

查看已定義的exchange,我們可以用rabbitmqctl list_exchanges命令,如圖:

圖中名為amq.*和沒有名字的exchange都是默認自帶的。

(PS:之前的例子中我們還沒有用到exchange的概念,但仍然成功地將消息發送到了隊列中。這是因為我們使用的是默認的exchange。)

CentOS 5.6 安裝RabbitMQ http://www.linuxidc.com/Linux/2013-02/79508.htm

RabbitMQ客戶端C++安裝詳細記錄 http://www.linuxidc.com/Linux/2012-02/53521.htm

用Python嘗試RabbitMQ http://www.linuxidc.com/Linux/2011-12/50653.htm

RabbitMQ集群環境生產實例部署 http://www.linuxidc.com/Linux/2012-10/72720.htm

Ubuntu下PHP + RabbitMQ使用 http://www.linuxidc.com/Linux/2010-07/27309.htm

在CentOS上安裝RabbitMQ流程 http://www.linuxidc.com/Linux/2011-12/49610.htm

我們需要將消息發送到指定的exchange中。

basicPublish的第一個參數就是exchange的名稱(重寫的幾個都是)。

空字符串表示默認的exchange:

channel.basicPublish( "logs", "", null, message.getBytes());

隊列的命名很重要,比如多個worker共享一個隊列,producer和consumer的關系用隊列名維系。

但並不是所有的場景都需要我們親自去命名。

比如我們需要獲得所有消息,而不是它的某個子集。

或者我們更關心最新的消息,而不是更早放到隊列的那些。

更多詳情見請繼續閱讀下一頁的精彩內容: http://www.linuxidc.com/Linux/2014-08/105107p2.htm

Copyright © Linux教程網 All Rights Reserved