你是否據說過或者使用過隊列?html
你是否據說過或者使用過消息隊列?前端
你是否據說過或者使用過RabbitMQ?java
提到這幾個詞,用過的人,也許以爲很簡單,沒用過的人,也許以爲很複雜,至少在我沒使用消息隊列以前,聽別人提到消息隊列,都感受很複雜,很高深。git
好了,言歸正傳,本篇博客咱們就講解下什麼是消息隊列,RabbitMQ環境的安裝配置,最後經過一個Hello World示例瞭解下RabbitMQ的使用方法。github
隊列是經常使用的數據結構之一,是一種特殊的線性表,特殊之處在於它只容許在表的前端(front)進行刪除操做,而在表的後端(rear)進行插入操做。spring
進行插入操做的端稱爲隊尾,進行刪除操做的端稱爲對頭。shell
在Java中,java.util包下已經有隊列的相關實現,咱們能夠直接使用。windows
消息是計算機/應用間傳送的數據單位,能夠很是簡單,例如只包含文本字符串,也能夠很複雜,可能包含嵌入對象。後端
消息隊列是在消息的傳輸過程當中保存消息的容器。瀏覽器
消息傳輸時,先發送到隊列,隊列的主要目的是提供路由並保證消息的傳遞,若是發送消息時接收者不可用,消息隊列會保留消息,直到能夠成功的傳遞它。
能夠把消息隊列理解成快遞公司,你須要寄一個物件(消息)給你的朋友,快遞公司收到物件會保證物件送到你的朋友手中,可能存在屢次寄送才送達成功的狀況,好比第一次送過去,你朋友不在家。
也許有人好奇,爲何咱們不直接使用JDK自帶的隊列,而是要使用消息隊列呢?
這是由於JDK自帶的隊列都存儲在內存中,一但應用或者服務器掛了,消息就丟失了,使用消息隊列能夠避免消息丟失問題(注意不是100%不丟失),就像快遞公司會保證你的物件寄到你的朋友手中,但確定有丟件的概率。
RabbitMQ是用Erlang語言開發的基於高級消息隊列協議(AMQP)的消息隊列中間件。
由於它開源,並且版本更新快,因此在國內互聯網公司被普遍使用。
其它使用的消息中間件還有ActiveMQ,RocketMQ,Kafka等,有興趣的同窗能夠自行研究。
還有2個專業術語要了解下:
生產者:發送消息的應用程序被稱爲生產者。
消費者:接收消息的應用程序被稱爲消費者。
瞭解完基本概念,讓咱們在本機上安裝下RabbitMQ,由於它是基於Erlang語言開發的,因此咱們要先安裝Erlang。
Erlang下載地址:http://www.erlang.org/downloads
由於個人電腦是Windows 64位系統,因此我下載的是64位的,系統是32位的同窗注意下版本。
安裝過程比較簡單,如下爲部分截圖:
安裝完成後,須要新建個環境變量(打開方式:計算機--右鍵--屬性--高級系統設置--高級--環境變量):
ERLANG_HOME E:\Program Files\erl10.4(修改成你的安裝路徑)
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的安裝就算完成了,其中有幾個默認值,咱們要知曉下:
瀏覽器輸入http://localhost:15672/,咱們能夠看到RabbitMQ的管理後臺,而後使用默認的guest帳號登陸,在這個後臺,能夠完成新建用戶,配置用戶角色,新建隊列等操做,固然,若是有的同窗比較喜歡命令行操做,也都有相對應的命令來完成操做,關於這些內容,後續單獨再寫博客講解。
既然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:
是否是以爲挺簡單的呢,趕忙在本機安裝試試吧!
源碼地址:https://github.com/zwwhnly/springboot-action.git,歡迎下載。