1.Windows下安裝RabbitMQ
(1):下載erlang,原因在於RabbitMQ服務端代碼是使用併發式語言erlang編寫的,下載地址:http://www.erlang.org/downloads,雙擊.exe文件進行安裝就好,安裝完成之後創建一個名爲ERLANG_HOME的環境變量,其值指向erlang的安裝目錄,同時將%ERLANG_HOME%\bin加入到Path中,最後打開命令行,輸入erl,如果出現erlang的版本信息就表示erlang語言環境安裝成功;
(2):下載RabbitMQ,下載地址:http://www.rabbitmq.com/,同樣雙擊.exe進行安裝就好;
(3):安裝RabbitMQ-Plugins,這個相當於是一個管理界面,方便我們在瀏覽器界面查看RabbitMQ各個消息隊列以及exchange的工作情況,安裝方法是:打開命令行cd進入rabbitmq的sbin目錄(我的目錄是:E:\software\rabbitmq\rabbitmq_server-3.6.5\sbin),輸入:rabbitmq-plugins enable rabbitmq_management命令,稍等會會發現出現plugins安裝成功的提示,默認是安裝6個插件,如果你在安裝插件的過程中出現了下面的錯誤:
解決方法:使用搜索文件工具(Everything)查找.erlang.cookie文件,將Windows文件下的.erlang.cookie文件copy到"User\用戶名"目錄,然後打開rabbitmq_server-3.6.5\sbin>rabbitmq-plugins enable rabbitmq_management,當看到Applying plugin configuration to rabbit@XXX... nothing to do.這時rabbitmq_server服務已經完成。
(4):插件安裝完之後,在瀏覽器輸入http://localhost:15672進行驗證,你會看到下面界面,輸入用戶名:guest,密碼:guest你就可以進入管理界面,當然用戶名密碼你都可以變的;
2.安裝完RabbitMQ之後,簡單瞭解下RabbitMQ中涉及到的幾個概念
producer:消息生產者
consumer:消息消費者
virtual host:虛擬主機,在RabbitMQ中,用戶只能在虛擬主機的層面上進行一些權限設置,比如我可以訪問哪些隊列,我可以處理哪些請求等等;
broker:消息轉發者,也就是我們RabbitMQ服務端充當的功能了,那麼消息是按照什麼規則進行轉發的呢?需要用到下面幾個概念;
exchange:交換機,他是和producer直接進行打交道的,有點類似於路由器的功能,主要就是進行轉發操作的唄,那麼producer到底用哪個exchange進行路由呢?這個取決於routing key(路由鍵),每個消息都有這個鍵,我們也可以自己設定,其實就是一字符串;
queue:消息隊列,用於存放消息,他接收exchange路由過來的消息,我們可以對隊列內容進行持久化操作,那麼queue到底接收那個exchange路由的消息呢?這個時候就要用到binding key(綁定鍵)了,綁定鍵會將隊列和exchange進行綁定,至於綁定方式,RabbitMQ提供了多種方式,大家可以看看網上各種方式。以上就是RabbitMQ涉及到的一些概念了,用一張圖表示這些概念之間的關係就是:
3.RabbitMQ簡單使用
Producer(生產者)端步驟:
(1):創建ConnectionFactory,並且設置一些參數,比如hostname,portNumber等等
(2):利用ConnectionFactory創建一個Connection連接
(3):利用Connection創建一個Channel通道
(4):創建queue並且和Channel進行綁定
(5):創建消息,並且發送到隊列中
注意,在我們當前的例子中,並沒有用到exchange交換機,RabbitMQ默認情況下是會創建一個空字符串名字的exchange的,如果我們沒有創建自己的exchange的話,默認就是使用的這個exchange;
jar如下:amqp-client-5.2.0.jar rabbitmq-client-1.3.0.jar
Producer端代碼:package com.rabbitmq;
import java.io.IOException;
import java.util.concurrent.TimeoutException;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
/**
* RabbitMQ 生產者
* @author Administrator
*
*/
public class Producer {
//隊列名稱
private final static String QUEUE_NAME = "Queue";
public static void main(String[] args) {
// 創建連接工廠
ConnectionFactory factory = null;
// 建立到代理服務器到連接
Connection connection = null;
// 獲得通道
Channel channel = null;
try {
factory = new ConnectionFactory();
//設置用戶名和密碼
factory.setUsername("guest");
factory.setPassword("guest");
// 設置 RabbitMQ 地址
factory.setHost("localhost");
// 建立到代理服務器到連接
connection = factory.newConnection();
channel = connection.createChannel();
channel.queueDeclare(QUEUE_NAME, false, false, false, null);
String message = "hello world .....";
channel.basicPublish("", QUEUE_NAME, null, message.getBytes("UTF-8"));
System.out.println("發送 message[" + message + "] to "+ QUEUE_NAME +" success!");
} catch (IOException e) {
e.printStackTrace();
} catch (TimeoutException e) {
e.printStackTrace();
} finally {
try {
// 關閉資源
channel.close();
connection.close();
} catch (IOException e) {
e.printStackTrace();
} catch (TimeoutException e) {
e.printStackTrace();
}
}
}
}
Producer運行結果如下:
發送
message[hello world .....] to Queue success!
Consumer(消費者)端步驟:
(1):創建ConnectionFactory,並且設置一些參數,比如hostname,portNumber等等
(2):利用ConnectionFactory創建一個Connection連接
(3):利用Connection創建一個Channel通道
(4):將queue和Channel進行綁定,注意這裏的queue名字要和前面producer創建的queue一致
(5):創建消費者Consumer來接收消息,同時將消費者和queue進行綁定
package com.rabbitmq;
import java.io.IOException;
import java.util.concurrent.TimeoutException;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import com.rabbitmq.client.QueueingConsumer;
import com.rabbitmq.client.QueueingConsumer.Delivery;
import com.rabbitmq.client.ShutdownSignalException;
/**
* RabbitMQ 消費者
* @author Administrator
*
*/
public class Consumer {
//隊列名稱
private final static String QUEUE_NAME = "Queue";
public static void main(String[] args) {
// 創建連接工廠
ConnectionFactory factory = null;
// 建立到代理服務器到連接
Connection connection = null;
// 獲得通道
Channel channel = null;
try {
factory = new ConnectionFactory();
factory.setUsername("guest");
factory.setPassword("guest");
factory.setHost("localhost");
// 建立到代理服務器到連接
connection = factory.newConnection();
channel = connection.createChannel();
// 1.隊列名2.是否持久化,3是否侷限與鏈接,4不再使用是否刪除,5其他的屬性
channel.queueDeclare(QUEUE_NAME, false, false, false, null);
// 聲明一個消費者,配置好獲取消息的方式
QueueingConsumer consumer = new QueueingConsumer(channel);
channel.basicConsume(QUEUE_NAME, true, consumer);
// 循環獲取消息
while (true) {
// 循環獲取信息
// 指向下一個消息,如果沒有會一直阻塞
Delivery delivery = consumer.nextDelivery();
String msg = new String(delivery.getBody());
System.out.println("接收 message[" + msg + "] from " + QUEUE_NAME);
}
} catch (IOException e) {
e.printStackTrace();
} catch (TimeoutException e) {
e.printStackTrace();
} catch (ShutdownSignalException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
try {
// 關閉資源
channel.close();
connection.close();
} catch (IOException e) {
e.printStackTrace();
} catch (TimeoutException e) {
e.printStackTrace();
}
}
}
}
Consumer運行結果如下:
接收 message[hello world .....] from Queue
4.RabbitMQ服務器web端(http://localhost:15672)
RabbitMQ服務器http://localhost:15672查看相關信息