這次我們試試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