RabbitMQ在Windows環境下的安裝與使用

Windows下安裝RabbitMQ

環境配置

部署環境

部署環境:windows server 2008 r2 enterprisehtml

官方安裝部署文檔:http://www.rabbitmq.com/install-windows.html官方文檔說明git

下載erlang

緣由在於RabbitMQ服務端代碼是使用併發式語言erlang編寫的,下載地址:http://www.erlang.org/downloads或者Erlang Windows二進制文件,雙擊.exe文件進行安裝就好,安裝完成以後建立一個名爲ERLANG_HOME的環境變量,其值指向erlang的安裝目錄,同時將%ERLANG_HOME%\bin加入到Path中,最後打開命令行,輸入erl,若是出現erlang的版本信息就表示erlang語言環境安裝成功;github

下載RabbitMQ

下載地址:http://www.rabbitmq.com/,一樣雙擊.exe進行安裝就好(這裏須要注意一點,默認的安裝目錄是C:/Program Files/....,這個目錄中是存在空格符的,咱們須要改變安裝目錄,貌似RabbitMQ安裝目錄中是不容許有空格的,我以前踩過這個大坑);web

安裝RabbitMQ-Plugins

這個至關因而一個管理界面,方便咱們在瀏覽器界面查看RabbitMQ各個消息隊列以及exchange的工做狀況,安裝方法是:打開命令行cd進入rabbitmq的sbin目錄(個人目錄是:E:\software\rabbitmq\rabbitmq_server-3.6.5\sbin),輸入:rabbitmq-plugins enable rabbitmq_management命令,稍等會會發現出現plugins安裝成功的提示,默認是安裝6個插件,若是你在安裝插件的過程當中出現了下面的錯誤:        windows

   解決方法是:首先在命令行輸入: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服務。ide

默認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();
            }
        }
    }
}
相關文章
相關標籤/搜索