環境配置 部署環境 部署環境:windows server 2008 r2 enterprise 官方安裝部署文檔:http://www.rabbitmq.com/install-windows.html官方文檔說明 下載erlang 原因在於RabbitMQ服務端代碼是使用併發式語言erlang編 ...
環境配置
部署環境
部署環境:windows server 2008 r2 enterprise
官方安裝部署文檔:http://www.rabbitmq.com/install-windows.html官方文檔說明
下載erlang
原因在於RabbitMQ服務端代碼是使用併發式語言erlang編寫的,下載地址:http://www.erlang.org/downloads或者Erlang Windows二進位文件,雙擊.exe文件進行安裝就好,安裝完成之後創建一個名為ERLANG_HOME的環境變數,其值指向erlang的安裝目錄,同時將%ERLANG_HOME%\bin加入到Path中,最後打開命令行,輸入erl,如果出現erlang的版本信息就表示erlang語言環境安裝成功;
下載RabbitMQ
下載地址:http://www.rabbitmq.com/,同樣雙擊.exe進行安裝就好(這裡需要註意一點,預設的安裝目錄是C:/Program Files/....,這個目錄中是存在空格符的,我們需要改變安裝目錄,貌似RabbitMQ安裝目錄中是不允許有空格的,我之前踩過這個大坑);
安裝RabbitMQ-Plugins
這個相當於是一個管理界面,方便我們在瀏覽器界面查看RabbitMQ各個消息隊列以及exchange的工作情況,安裝方法是:打開命令行cd進入rabbitmq的sbin目錄(我的目錄是:E:\software\rabbitmq\rabbitmq_server-3.6.5\sbin),輸入:rabbitmq-plugins enable rabbitmq_management命令,稍等會會發現出現plugins安裝成功的提示,預設是安裝6個插件,如果你在安裝插件的過程中出現了下麵的錯誤:
解決方法是:首先在命令行輸入:rabbitmq-service stop,接著輸入rabbitmq-service remove,再接著輸入rabbitmq-service install,接著輸入rabbitmq-service start,最後重新輸入rabbitmq-plugins enable rabbitmq_management試試,我是這樣解決的;
RabbitMQ簡介
在官方頁面,下載對應的安裝包,註意,RabbitMQ安裝的時候會占用幾個埠,防火牆和其他安全工具可能會阻止RabbitMQ綁定到埠。當這種情況發生時,RabbitMQ將無法啟動。確保可以打開以下埠,當然也可以安裝好後自己通過修改配置文件來修改占用的埠,然後開啟服務。
- 4369:epmd,RabbitMQ節點和CLI工具使用的對等發現服務
- 5672,5671:由AMQP 0-9-1和1.0客戶端使用,不帶TLS和TLS
- 25672:Erlang分發用於節點間和CLI工具通信,並從動態範圍分配(預設情況下限製為單個埠,計算為AMQP埠+ 20000)。有關詳細信息,請參閱網路指南。
- 15672:HTTP API客戶端和rabbitmqadmin(僅當啟用管理插件時)
- 61613,61414:沒有和使用TLS的STOMP客戶端(只有啟用了STOMP插件)
- 1883,8883 :( MQTT客戶端沒有和帶有TLS,如果啟用了MQTT插件
- 15674:STOMP-over-WebSockets客戶端(只有啟用了Web STOMP插件)
- 15675:MQTT-over-WebSockets客戶端(僅當啟用了Web MQTT插件時)
安裝成功後再開始菜單中可以找到所有安裝的應用以及插件。
開啟服務
查看網頁管理
插件安裝完之後,在瀏覽器輸入http://localhost:15672進行驗證,你會看到下麵界面,輸入用戶名:guest,密碼:guest你就可以進入管理界面,當然用戶名密碼你都可以變的;
配置允許遠程訪問
更多情況下,隊列服務往往不在我們本機上,我們需要遠程來控制RabbitMQ,但是預設是無法通過http://server-name:15672來訪問的,可以通過修改\RabbitMQ Server\rabbitmq_server-3.6.10\etc 下Rabbitmq.config來設置允許guest用戶遠程登錄,具體修改為如下值,然後就到服務管理器中重啟RabbitMQ服務。
預設RabbitMQ會在C:\Users\Administrator\AppData\Roaming\RabbitMQ 中生成一個配置文件,rabbitmq.config 裡面就是實際用到的配置信息,如果圖方便,也可以這裡直接改。
[{rabbit, [{loopback_users, [guest]}]}].
RabbitMQ概念
producer:消息生產者
consumer:消息消費者
virtual host:虛擬主機,在RabbitMQ中,用戶只能在虛擬主機的層面上進行一些許可權設置,比如我可以訪問哪些隊列,我可以處理哪些請求等等;
broker:消息轉發者,也就是我們RabbitMQ服務端充當的功能了,那麼消息是按照什麼規則進行轉發的呢?需要用到下麵幾個概念;
exchange:交換機,他是和producer直接進行打交道的,有點類似於路由器的功能,主要就是進行轉發操作的唄,那麼producer到底用哪個exchange進行路由呢?這個取決於routing key(路由鍵),每個消息都有這個鍵,我們也可以自己設定,其實就是一字元串;
queue:消息隊列,用於存放消息,他接收exchange路由過來的消息,我們可以對隊列內容進行持久化操作,那麼queue到底接收那個exchange路由的消息呢?這個時候就要用到binding key(綁定鍵)了,綁定鍵會將隊列和exchange進行綁定,至於綁定方式,RabbitMQ提供了多種方式,大家可以看看鴻洋大神的RabbitMQ博客系列(點擊查看);
以上就是RabbitMQ涉及到的一些概念了,用一張圖表示這些概念之間的關係就是:
RabbitMQ簡單使用
producer(生產者)端步驟:
(1):創建ConnectionFactory,並且設置一些參數,比如hostname,portNumber等等
(2):利用ConnectionFactory創建一個Connection連接
(3):利用Connection創建一個Channel通道
(4):創建queue並且和Channel進行綁定
(5):創建消息,並且發送到隊列中
註意,在我們當前的例子中,並沒有用到exchange交換機,RabbitMQ預設情況下是會創建一個空字元串名字的exchange的,如果我們沒有創建自己的exchange的話,預設就是使用的這個exchange;
producer端代碼(引用RabbitMQ.Client):
//引用 RabbitMQ.Client、RabbitMQ.ServiceModel
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("已經發送消息....."+message); } 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(); } } } }
consumer(消費者)端步驟:
(1):創建ConnectionFactory,並且設置一些參數,比如hostname,portNumber等等
(2):利用ConnectionFactory創建一個Connection連接
(3):利用Connection創建一個Channel通道
(4):將queue和Channel進行綁定,註意這裡的queue名字要和前面producer創建的queue一致
(5):創建消費者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 { //關閉資源 channel.close(); connection.close(); } catch (IOException e) { e.printStackTrace(); } catch (TimeoutException e) { e.printStackTrace(); } } } }