1.Windows下安裝RabbitMQ需要以下幾個步驟
(1):下載erlang镰绎,原因在于RabbitMQ服務(wù)端代碼是使用并發(fā)式語言erlang編寫的声登,下載地址:http://www.erlang.org/downloads篡帕,雙擊.exe文件進行安裝就好屑迂,安裝完成之后創(chuàng)建一個名為ERLANG_HOME的環(huán)境變量瑞驱,其值指向erlang的安裝目錄竿音,同時將%ERLANG_HOME%\bin加入到Path中和屎,最后打開命令行,輸入erl春瞬,如果出現(xiàn)erlang的版本信息就表示erlang語言環(huán)境安裝成功柴信;
(2):下載RabbitMQ,下載地址:http://www.rabbitmq.com/宽气,同樣雙擊.exe進行安裝就好(這里需要注意一點随常,默認的安裝目錄是C:/Program Files/....,這個目錄中是存在空格符的萄涯,我們需要改變安裝目錄绪氛,貌似RabbitMQ安裝目錄中是不允許有空格的,我之前踩過這個大坑)涝影;
(3):安裝RabbitMQ-Plugins枣察,這個相當(dāng)于是一個管理界面,方便我們在瀏覽器界面查看RabbitMQ各個消息隊列以及exchange的工作情況燃逻,安裝方法是:打開命令行cd進入rabbitmq的sbin目錄(我的目錄是:E:\software\rabbitmq\rabbitmq_server-3.6.5\sbin)序目,輸入:rabbitmq-plugins enable rabbitmq_management命令,稍等會會發(fā)現(xiàn)出現(xiàn)plugins安裝成功的提示伯襟,默認是安裝6個插件猿涨,如果你在安裝插件的過程中出現(xiàn)了下面的錯誤:
[圖片上傳失敗...(image-f5443b-1530373284419)]
解決方法是:首先在命令行輸入:rabbitmq-service stop,接著輸入rabbitmq-service remove逗旁,再接著輸入rabbitmq-service install嘿辟,接著輸入rabbitmq-service start,最后重新輸入rabbitmq-plugins enable rabbitmq_management試試片效,我是這樣解決的红伦;
(4):插件安裝完之后,在瀏覽器輸入http://localhost:15672進行驗證淀衣,你會看到下面界面昙读,輸入用戶名:guest,密碼:guest你就可以進入管理界面膨桥,當(dāng)然用戶名密碼你都可以變的蛮浑;
[圖片上傳失敗...(image-80923b-1530373284417)]
2.安裝完RabbitMQ之后唠叛,我們先來簡單了解下RabbitMQ中涉及到的幾個概念
producer:消息生產(chǎn)者
consumer:消息消費者
virtual host:虛擬主機,在RabbitMQ中沮稚,用戶只能在虛擬主機的層面上進行一些權(quán)限設(shè)置艺沼,比如我可以訪問哪些隊列,我可以處理哪些請求等等蕴掏;
broker:消息轉(zhuǎn)發(fā)者障般,也就是我們RabbitMQ服務(wù)端充當(dāng)?shù)墓δ芰耍敲聪⑹前凑帐裁匆?guī)則進行轉(zhuǎn)發(fā)的呢盛杰?需要用到下面幾個概念挽荡;
exchange:交換機,他是和producer直接進行打交道的即供,有點類似于路由器的功能定拟,主要就是進行轉(zhuǎn)發(fā)操作的唄,那么producer到底用哪個exchange進行路由呢逗嫡?這個取決于routing key(路由鍵)青自,每個消息都有這個鍵,我們也可以自己設(shè)定驱证,其實就是一字符串性穿;
queue:消息隊列,用于存放消息雷滚,他接收exchange路由過來的消息,我們可以對隊列內(nèi)容進行持久化操作吗坚,那么queue到底接收那個exchange路由的消息呢祈远?這個時候就要用到binding key(綁定鍵)了,綁定鍵會將隊列和exchange進行綁定商源,至于綁定方式车份,RabbitMQ提供了多種方式,大家可以看看鴻洋大神的RabbitMQ博客系列([點擊查看](http://blog.csdn.net/lmj623565791/article/category/2386657))牡彻;
以上就是RabbitMQ涉及到的一些概念了扫沼,用一張圖表示這些概念之間的關(guān)系就是:
[圖片上傳失敗...(image-fe7661-1530373284417)]
3.RabbitMQ簡單使用
producer(生產(chǎn)者)端步驟:
(1):創(chuàng)建ConnectionFactory,并且設(shè)置一些參數(shù)庄吼,比如hostname,portNumber等等
(2):利用ConnectionFactory創(chuàng)建一個Connection連接
(3):利用Connection創(chuàng)建一個Channel通道
(4):創(chuàng)建queue并且和Channel進行綁定
(5):創(chuàng)建消息缎除,并且發(fā)送到隊列中
注意,在我們當(dāng)前的例子中总寻,并沒有用到exchange交換機器罐,RabbitMQ默認情況下是會創(chuàng)建一個空字符串名字的exchange的,如果我們沒有創(chuàng)建自己的exchange的話渐行,默認就是使用的這個exchange轰坊;
producer端代碼:
public class Sender { private final static String QUEUE_NAME = "MyQueue"; public static void main(String[] args) { send(); } public static void send() { ConnectionFactory factory = null; Connection connection = null; Channel channel = null; try { factory = new ConnectionFactory(); factory.setHost("localhost"); connection = factory.newConnection(); channel = connection.createChannel(); channel.queueDeclare(QUEUE_NAME, false, false, false, null); String message = "my first message ....."; channel.basicPublish("", QUEUE_NAME, null, message.getBytes("UTF-8")); System.out.println("已經(jīng)發(fā)送消息....."+message); } catch (IOException e) { e.printStackTrace(); } catch (TimeoutException e) { e.printStackTrace(); }finally{ try { //關(guān)閉資源 channel.close(); connection.close(); } catch (IOException e) { e.printStackTrace(); } catch (TimeoutException e) { e.printStackTrace(); } } }}
consumer(消費者)端步驟:
(1):創(chuàng)建ConnectionFactory铸董,并且設(shè)置一些參數(shù),比如hostname,portNumber等等
(2):利用ConnectionFactory創(chuàng)建一個Connection連接
(3):利用Connection創(chuàng)建一個Channel通道
(4):將queue和Channel進行綁定肴沫,注意這里的queue名字要和前面producer創(chuàng)建的queue一致
(5):創(chuàng)建消費者Consumer來接收消息粟害,同時將消費者和queue進行綁定
consumer端代碼:
public class Receiver { private final static String QUEUE_NAME = "MyQueue"; public static void main(String[] args) { receive(); } public static void receive() { ConnectionFactory factory = null; Connection connection = null; Channel channel = null; try { factory = new ConnectionFactory(); factory.setHost("localhost"); connection = factory.newConnection(); channel = connection.createChannel(); channel.queueDeclare(QUEUE_NAME, false, false, false, null); Consumer consumer = new DefaultConsumer(channel){ @Override public void handleDelivery(String consumerTag, Envelope envelope, BasicProperties properties, byte[] body) throws IOException { System.out.println("11111111111"); String message = new String(body, "UTF-8"); System.out.println("收到消息....."+message); }}; channel.basicConsume(QUEUE_NAME, true,consumer); } catch (IOException e) { e.printStackTrace(); } catch (TimeoutException e) { e.printStackTrace(); }finally{ try { //關(guān)閉資源 channel.close(); connection.close(); } catch (IOException e) { e.printStackTrace(); } catch (TimeoutException e) { e.printStackTrace(); } } }}
好了,這篇先到這了颤芬,下一篇我會簡單介紹點更深入的東西悲幅,后續(xù)也會對RabbitMQ原生API進行封裝,便于我們自己開發(fā)驻襟;