RabbitMQ簡單入門實例

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查看相關信息

    

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章