1. 程式人生 > >RabbitMQ使用教程(一)RabbitMQ環境安裝配置及Hello World示例

RabbitMQ使用教程(一)RabbitMQ環境安裝配置及Hello World示例

你是否聽說過或者使用過佇列?

你是否聽說過或者使用過訊息佇列?

你是否聽說過或者使用過RabbitMQ?

提到這幾個詞,用過的人,也許覺得很簡單,沒用過的人,也許覺得很複雜,至少在我沒使用訊息佇列之前,聽別人提到訊息佇列,都感覺很複雜,很高深。

好了,言歸正傳,本篇部落格我們就講解下什麼是訊息佇列,RabbitMQ環境的安裝配置,最後通過一個Hello World示例瞭解下Rabbit MQ的使用方法。

1.基本概念講解

1.1佇列(Queue)

佇列是常用的資料結構之一,是一種特殊的線性表,特殊之處在於它只允許在表的前端(front)進行刪除操作,而在表的後端(rear)進行插入操作。

進行插入操作的端稱為隊尾,進行刪除操作的端稱為對頭。

在Java中,java.util包下已經有佇列的相關實現,我們可以直接使用。

1.2訊息佇列(Message Queue)

訊息是計算機/應用間傳送的資料單位,可以非常簡單,例如只包含文字字串,也可以很複雜,可能包含嵌入物件。

訊息佇列是在訊息的傳輸過程中儲存訊息的容器。

訊息傳輸時,先發送到佇列,佇列的主要目的是提供路由並保證訊息的傳遞,如果傳送訊息時接收者不可用,訊息佇列會保留訊息,直到可以成功的傳遞它。

可以把訊息佇列理解成快遞公司,你需要寄一個物件(訊息)給你的朋友,快遞公司收到物件會保證物件送到你的朋友手中,可能存在多次寄送才送達成功的情況,比如第一次送過去,你朋友不在家。

也許有人好奇,為什麼我們不直接使用JDK自帶的佇列,而是要使用訊息佇列呢?

這是因為JDK自帶的佇列都儲存在記憶體中,一但應用或者伺服器掛了,訊息就丟失了,使用訊息佇列可以避免訊息丟失問題(注意不是100%不丟失),就像快遞公司會保證你的物件寄到你的朋友手中,但肯定有丟件的機率。

1.3RabbitMQ

RabbitMQ是用Erlang語句開發的基於高階訊息佇列協議(AMQP)的訊息佇列中介軟體。

因為它開源,而且版本更新快,所以在國內網際網路公司被廣泛使用。

其它使用的訊息中介軟體還有ActiveMQ,RocketMQ,Kafka等,有興趣的同學可以自行研究。

還有2個專業術語要了解下:

生產者:傳送訊息的應用程式被稱為生產者。

消費者:接收訊息的應用程式被稱為消費者。

2.RabbitMQ安裝及配置

瞭解完基本概念,讓我們在本機上安裝下RabbitMQ,因為它是基於Erlang語言開發的,所以我們要先安裝Erlang。

2.1Erlang安裝及配置

Erlang下載地址:http://www.erlang.org/downloads

因為我的電腦是Windows 64位系統,所以我下載的是64位的,系統是32位的同學注意下版本。

安裝過程比較簡單,以下為部分截圖:

安裝完成後,需要新建個環境變數(開啟方式:計算機--右鍵--屬性--高階系統設定--高階--環境變數):

ERLANG_HOME E:\Program Files\erl10.4(修改為你的安裝路徑)

2.2RabbitMQ安裝及配置

RabbitMQ下載地址:https://www.rabbitmq.com/install-windows.html

安裝過程也比較簡單,以下為部分截圖:

安裝完成後,在cmd視窗中執行以下命令啟用RabbitMQ Manage Plugin

"E:\Program Files\RabbitMQ Server\rabbitmq_server-3.7.15\sbin\rabbitmq-plugins.bat" enable rabbitmq_management

然後執行命令重啟RabbitMQ服務:

net stop RabbitMQ && net start RabbitMQ

如果你的cmd視窗不是以管理員身份開啟的,會出現如下報錯資訊

解決方法也很簡單,以管理員身份開啟cmd視窗執行命令即可

關於這一步,可以不使用命令重啟RabbitMQ服務,而是開啟Windows的服務列表,找到RabbitMQ服務,重啟即可。

到這一步,RabbitMQ的安裝就算完成了,其中有幾個預設值,我們要知曉下:

  • 預設的埠號:5672
  • 預設的使用者是guest guest
  • 管理後臺的預設埠號:15672

瀏覽器輸入http://localhost:15672/,我們可以看到RabbitMQ的管理後臺,然後使用預設的guest賬號登入,在這個後臺,可以完成新建使用者,配置使用者角色,新建佇列等操作,當然,如果有的同學比較喜歡命令列操作,也都有相對應的命令來完成操作,關於這些內容,後續單獨再寫部落格講解。

3.Hello World示例

既然RabbitMQ環境安裝好了,那麼我們通過1個簡單的示例來看下效果。

首先在pom檔案中,新增依賴:

<dependency>
   <groupId>com.rabbitmq</groupId>
   <artifactId>amqp-client</artifactId>
   <version>5.7.0</version>
</dependency>

然後新建一個生產者類(Producer),用來新建一個佇列'hello',然後往佇列裡傳送訊息‘Hello World’:

package com.zwwhnly.springbootaction.rabbitmq.helloworld;

import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;

import java.io.IOException;
import java.util.concurrent.TimeoutException;

public class Producer {
    private final static String QUEUE_NAME = "hello";

    public static void main(String[] args) throws IOException, TimeoutException {
        // 建立連線
        ConnectionFactory factory = new ConnectionFactory();
        // 設定 RabbitMQ 的主機名
        factory.setHost("localhost");
        // 建立一個連線
        Connection connection = factory.newConnection();
        // 建立一個通道
        Channel channel = connection.createChannel();
        // 指定一個佇列,不存在的話自動建立
        channel.queueDeclare(QUEUE_NAME, false, false, false, null);
        // 傳送訊息
        String message = "Hello World!";
        channel.basicPublish("", QUEUE_NAME, null, message.getBytes());
        System.out.println(" [x] Sent '" + message + "'");
        // 關閉頻道和連線
        channel.close();
        connection.close();
    }
}

執行程式碼,在RabbitMQ管理後臺,會看到佇列新建成功,並且有1個訊息待消費:

最後我們新建一個消費者類(Consumer),用來消費這個訊息:

package com.zwwhnly.springbootaction.rabbitmq.helloworld;

import com.rabbitmq.client.*;

import java.io.IOException;
import java.util.concurrent.TimeoutException;

public class Consumer {
    private final static String QUEUE_NAME = "hello";

    public static void main(String[] args) throws IOException, TimeoutException {
        // 建立連線
        ConnectionFactory factory = new ConnectionFactory();
        // 設定 RabbitMQ 的主機名
        factory.setHost("localhost");
        // 建立一個連線
        Connection connection = factory.newConnection();
        // 建立一個通道
        Channel channel = connection.createChannel();
        // 指定一個佇列
        channel.queueDeclare(QUEUE_NAME, false, false, false, null);
        // 建立佇列消費者
        com.rabbitmq.client.Consumer consumer = new DefaultConsumer(channel) {
            @Override
            public void handleDelivery(String consumerTag, Envelope envelope,
                                       AMQP.BasicProperties properties, byte[] body) throws IOException {
                String message = new String(body, "UTF-8");
                System.out.println("Received Message '" + message + "'");
            }
        };
        channel.basicConsume(QUEUE_NAME, true, consumer);
    }
}

執行程式碼,我們會發現控制檯輸出:

Received Message 'Hello World!'

此時再看下RabbitMQ管理後臺,會發現佇列'hello'待消費的訊息為0:

是不是覺得挺簡單的呢,趕緊在本機安裝試試吧!

4.原始碼

原始碼地址:https://github.com/zwwhnly/springboot-action.git,歡迎下載。

5.參考連結

windows下 安裝 rabbitMQ 及操作常用命令

【譯】RabbitMQ 實戰教程(一) Hello Wor