# RabbitMQ入門教程 For Java【1】 - Hello World
? ? ? ?RabbitMQ是消息代理。從本質上說,它接受來自生產者的信息,并將它們傳遞給消費者。在兩者之間,它可以根據你給它的路由,緩沖規則進行傳遞消息。
? ? ? ?如果你的工作中需要用到RabbitMQ,那么我建議你先在電腦上安裝好RabbitMQ服務器,然后打開eclipse,跟這我的教程一步步的學習RabbitMQ,這樣你會對RabbitMQ有一個全面的認識,而且能打好一個很好的基礎。如果你只是了解一下,那就隨便看看吧。
### **我的開發環境:**
操作系統:**Windows7 64bit**
開發環境:**JDK 1.7 -?1.7.0_55**
開發工具:**Eclipse Kepler SR2**
RabbitMQ版本:**3.6.0**
Elang版本:**erl7.2.1**
關于Windows7下安裝RabbitMQ的教程請先在網上找一下,有空我再補安裝教程。
### 源碼地址
https://github.com/chwshuang/rabbitmq.git
### 一、專業術語
### 1. 生產者:
? ? ? ?在現實生活中就好比制造商品的工廠,他們是商品的生產者。生產者只意味著發送。發送消息的程序稱之為一個生產者。我們用“P”表示:?

### 2. 隊列:
? ? ? ? 隊列就像存放商品的倉庫或者商店,是生產商品的工廠和購買商品的用戶之間的中轉站。隊列就像是一個倉庫或者流水線。在RabbitMQ中,信息流從你的應用程序出發,來到RabbitMQ的隊列,所有信息可以只存儲在一個隊列中。隊列可以存儲很多的消息,因為它基本上是一個無限制的緩沖區,前提是你的機器有足夠的存儲空間。多個生產者可以將消息發送到同一個隊列中,多個消費者也可以只從同一個隊列接收數據。這就是隊列的特性。隊列用下面的圖表示,圖上面是隊列的名字:?

### 3. 消費者
? ? ? ? 消費者就好比是從商店購買或從倉庫取走商品的人,消費的意思就是接收。消費者是一個程序,主要是等待接收消息。我們的用“C”表示?

**注意:**
? ? ? ? 生產者,消費者和隊列(RabbitMQ)不必部署在同一臺機器上。實際在生產環境的大多數應用中,他們都是分開部署的。
### 二、“Hello World”
### 1. 說明
? ? ? ? 在本教程中,我們我們通過2個java程序,一個發送消息的生產者,和一個接收信息并打印的消費者。想要了解rabbitmq,必須了解一些最基礎的內容,我們先從一些代碼片段來了解產生信息和接收消息的流程和方法。在編寫代碼前,我們先來用戶一張圖表示要做的事,在下圖中,“P”是我們的生產者,“C”是我們的消費者。在中間紅色框是代表RabbitMQ中的一個消息隊列。箭頭指向表示信息流的方向。?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
### 2. 項目目錄?
? ? ? ? 在eclipse中創建一個rabbitmq的java項目,然后在項目下建一個名為lib的source folder, 然后將rabbitmq官網下載的rabbitmq-java-client-bin-3.6.0.rar解壓出rabbitmq-client.jar拷貝到lib目錄,如果創建的是Maven項目,只需要添加如下依賴:
~~~
<dependencies>
<dependency>
<groupId>com.rabbitmq</groupId>
<artifactId>amqp-client</artifactId>
<version>3.6.0</version>
</dependency>
... ...
</dependencies>
~~~
然后在src目錄下創建一個com.aitongyi.rabbit.helloworld包,最后項目目錄如下:

### 3.??消息生產者
~~~
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
/**
* 消息生產者
*
* @author hushuang
*
*/
public class P {
private final static String QUEUE_NAME = "hello";
public static void main(String[] argv) throws Exception {
// 創建連接工廠
ConnectionFactory factory = new ConnectionFactory();
// 設置RabbitMQ地址
factory.setHost("localhost");
// 創建一個新的連接
Connection connection = factory.newConnection();
// 創建一個頻道
Channel channel = connection.createChannel();
// 聲明一個隊列 -- 在RabbitMQ中,隊列聲明是冪等性的(一個冪等操作的特點是其任意多次執行所產生的影響均與一次執行的影響相同),也就是說,如果不存在,就創建,如果存在,不會對已經存在的隊列產生任何影響。
channel.queueDeclare(QUEUE_NAME, false, false, false, null);
String message = "Hello World!";
// 發送消息到隊列中
channel.basicPublish("", QUEUE_NAME, null, message.getBytes("UTF-8"));
System.out.println("P [x] Sent '" + message + "'");
// 關閉頻道和連接
channel.close();
connection.close();
}
}
~~~
### 4. 消息消費者
~~~
import com.rabbitmq.client.*;
import java.io.IOException;
/**
* 消息消費者
*
* @author hushuang
*
*/
public class C {
private final static String QUEUE_NAME = "hello";
public static void main(String[] argv) throws Exception {
// 創建連接工廠
ConnectionFactory factory = new ConnectionFactory();
// 設置RabbitMQ地址
factory.setHost("localhost");
// 創建一個新的連接
Connection connection = factory.newConnection();
// 創建一個頻道
Channel channel = connection.createChannel();
// 聲明要關注的隊列 -- 在RabbitMQ中,隊列聲明是冪等性的(一個冪等操作的特點是其任意多次執行所產生的影響均與一次執行的影響相同),也就是說,如果不存在,就創建,如果存在,不會對已經存在的隊列產生任何影響。
channel.queueDeclare(QUEUE_NAME, false, false, false, null);
System.out.println("C [*] Waiting for messages. To exit press CTRL+C");
// DefaultConsumer類實現了Consumer接口,通過傳入一個頻道,告訴服務器我們需要那個頻道的消息,如果頻道中有消息,就會執行回調函數handleDelivery
Consumer consumer = new DefaultConsumer(channel) {
@Override
public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
String message = new String(body, "UTF-8");
System.out.println("C [x] Received '" + message + "'");
}
};
// 自動回復隊列應答 -- RabbitMQ中的消息確認機制,后面章節會詳細講解
channel.basicConsume(QUEUE_NAME, true, consumer);
}
}
~~~
### 5. 運行測試
? ? ? ? 如果在windows7下,你需要先雙擊【RabbitMQ Server\rabbitmq_server-3.6.0\sbin】目錄下的rabbitmq-server.bat,來啟動RabbitMQ服務。負責,運行我們的程序時,會提示【java.net.ConnectException: Connection refused: connect】
C [*] Waiting for messages. To exit press CTRL+CC [x] Received 'Hello World!'
? ? ? ??先運行消費者服務器來關注【hello】這個隊列的情況。
~~~
C [*] Waiting for messages. To exit press CTRL+C
~~~
C [*] Waiting for messages. To exit press CTRL+CC [x] Received 'Hello World!'
? ? ? ??然后再運行生產者端,發送消息到隊列中:
~~~
P [x] Sent 'Hello World!'
~~~
C [*] Waiting for messages. To exit press CTRL+CC [x] Received 'Hello World!'
? ? ? ??再切換到消費者端的控制臺,查看日志:
~~~
C [*] Waiting for messages. To exit press CTRL+C
C [x] Received 'Hello World!'
~~~
### 6. 總結
? ? ? ??從上面的日志,我們就算是對RabbitMQ 的消息流有了一個基本的了解,如果你想更進一步,請進入到第二章-Work Queues的教程
本教程所有文章:
[RabbitMQ入門教程 For Java【1】 - Hello World](http://blog.csdn.net/chwshuang/article/details/50521708)? -?你好世界!?
[RabbitMQ入門教程 For Java【2】 - Work Queues](http://blog.csdn.net/chwshuang/article/details/50506284)??- 工作隊列
[RabbitMQ入門教程 For Java【3】 - Publish/Subscribe](http://blog.csdn.net/chwshuang/article/details/50512057)?- 發布/訂閱
[RabbitMQ入門教程 For Java【4】 - Routing](http://blog.csdn.net/chwshuang/article/details/50505060)?- ?消息路由
[RabbitMQ入門教程 For Java【5】 - Topic](http://blog.csdn.net/chwshuang/article/details/50516904)? - ?模糊匹配
[RabbitMQ入門教程 For Java【6】 - Remote procedure call (RPC)](http://blog.csdn.net/chwshuang/article/details/50518570)?- 遠程調用
### 提示
由于本教程中rabbitmq是在本機安裝,使用的是默認端口(5672)。?
如果你的例子運行中的主機、端口不同,請進行必要設置,否則可能無法運行。
如果你對rabbitmq有更多想法,可以通過GitHub項目成員找到我們的郵件地址聯系他們:https://github.com/orgs/rabbitmq/people