Introduction
RabbitMq接收并傳遞消息,你可以把它當(dāng)做一個(gè)郵局。當(dāng)你把信件放到郵箱里的時(shí)候,你能確定會(huì)有郵遞員最終會(huì)正確遞送你的郵件。RabbitMq就是一個(gè)郵箱、一個(gè)郵局和一個(gè)郵遞員。

在RabbitMq里,一個(gè)隊(duì)列就代表一個(gè)郵箱。雖然消息流經(jīng)RbbitMq和你的應(yīng)用,但是消息只能被存在隊(duì)列里。隊(duì)列只會(huì)被服務(wù)器的內(nèi)存和磁盤所限制,本質(zhì)上就是一個(gè)大的消息緩沖區(qū)。一個(gè)隊(duì)列可以接收多個(gè)生產(chǎn)者的消息,也可以被多個(gè)消費(fèi)者所接收。

消費(fèi)者接收隊(duì)列里的消息。

在這個(gè)教程中,我們會(huì)寫兩個(gè)程序,一個(gè)生產(chǎn)者程序,發(fā)送一個(gè)消息,一個(gè)消費(fèi)者程序,接收消息并把它們打印出來。

發(fā)送消息

Sending
Send是消息發(fā)送者,Recv是消息接受者。
Send.java代碼如下


然后我們就可以創(chuàng)建一個(gè)連接了。

這個(gè)連接抽象了套接字連接,負(fù)責(zé)了協(xié)議版本的轉(zhuǎn)換和身份驗(yàn)證,等等。我們用本地機(jī)器作為服務(wù)器,所以host是localhost,如果我們想要使用其他機(jī)器的話,我們可以直接寫主機(jī)的IP地址或者域名。
然后我們創(chuàng)建一個(gè)信道(Channel),也是大部分API調(diào)用入口。為了發(fā)送消息,我們必須先聲明一個(gè)隊(duì)列。

聲明隊(duì)列這個(gè)操作是冪等的——他只會(huì)在不存在的時(shí)候被創(chuàng)建。圖中的消息內(nèi)容是一個(gè)字節(jié)數(shù)組,所以你可以想怎么編碼都行。
最后,不要忘記關(guān)閉信道和連接。
Receiving
消費(fèi)者從RabbitMq獲取消息,不像生產(chǎn)者,我們要保持消費(fèi)者一直運(yùn)行,監(jiān)聽消息并且打印出來。


DefaultConsumer是一個(gè)實(shí)現(xiàn)了Consumer接口的類,我們使用它來緩存服務(wù)器推給我們的消息。
把隊(duì)列的名字設(shè)置成和生產(chǎn)者相同,然后我們打開連接和信道,然后聲明和生產(chǎn)者相同的隊(duì)列。

注意,在消費(fèi)者里我們也一樣的聲明了隊(duì)列,因?yàn)?,我們可能先于生產(chǎn)者啟動(dòng)消費(fèi)者,我們想確保在消費(fèi)消息之前隊(duì)列存在。
既然是異步的,我們還提供了一個(gè)(在我們準(zhǔn)備好用消息之前保存消息的)對(duì)象形式的回調(diào)。

Putting it all together
編譯運(yùn)行略。
翻譯自https://www.rabbitmq.com/tutorials/tutorial-one-java.html