摘要:進(jìn)行插入操作的端稱為隊(duì)尾,進(jìn)行刪除操作的端稱為對(duì)頭。還有個(gè)專業(yè)術(shù)語(yǔ)要了解下生產(chǎn)者發(fā)送消息的應(yīng)用程序被稱為生產(chǎn)者。消費(fèi)者接收消息的應(yīng)用程序被稱為消費(fèi)者。參考鏈接下安裝及操作常用命令譯實(shí)戰(zhàn)教程一
你是否聽(tīng)說(shuō)過(guò)或者使用過(guò)隊(duì)列?
你是否聽(tīng)說(shuō)過(guò)或者使用過(guò)消息隊(duì)列?
你是否聽(tīng)說(shuō)過(guò)或者使用過(guò)RabbitMQ?
提到這幾個(gè)詞,用過(guò)的人,也許覺(jué)得很簡(jiǎn)單,沒(méi)用過(guò)的人,也許覺(jué)得很復(fù)雜,至少在我沒(méi)使用消息隊(duì)列之前,聽(tīng)別人提到消息隊(duì)列,都感覺(jué)很復(fù)雜,很高深。
好了,言歸正傳,本篇博客我們就講解下什么是消息隊(duì)列,RabbitMQ環(huán)境的安裝配置,最后通過(guò)一個(gè)Hello World示例了解下RabbitMQ的使用方法。
1.基本概念講解 1.1隊(duì)列(Queue)隊(duì)列是常用的數(shù)據(jù)結(jié)構(gòu)之一,是一種特殊的線性表,特殊之處在于它只允許在表的前端(front)進(jìn)行刪除操作,而在表的后端(rear)進(jìn)行插入操作。
進(jìn)行插入操作的端稱為隊(duì)尾,進(jìn)行刪除操作的端稱為對(duì)頭。
在Java中,java.util包下已經(jīng)有隊(duì)列的相關(guān)實(shí)現(xiàn),我們可以直接使用。
1.2消息隊(duì)列(Message Queue)
消息是計(jì)算機(jī)/應(yīng)用間傳送的數(shù)據(jù)單位,可以非常簡(jiǎn)單,例如只包含文本字符串,也可以很復(fù)雜,可能包含嵌入對(duì)象。
消息隊(duì)列是在消息的傳輸過(guò)程中保存消息的容器。
消息傳輸時(shí),先發(fā)送到隊(duì)列,隊(duì)列的主要目的是提供路由并保證消息的傳遞,如果發(fā)送消息時(shí)接收者不可用,消息隊(duì)列會(huì)保留消息,直到可以成功的傳遞它。
可以把消息隊(duì)列理解成快遞公司,你需要寄一個(gè)物件(消息)給你的朋友,快遞公司收到物件會(huì)保證物件送到你的朋友手中,可能存在多次寄送才送達(dá)成功的情況,比如第一次送過(guò)去,你朋友不在家。
也許有人好奇,為什么我們不直接使用JDK自帶的隊(duì)列,而是要使用消息隊(duì)列呢?
這是因?yàn)镴DK自帶的隊(duì)列都存儲(chǔ)在內(nèi)存中,一但應(yīng)用或者服務(wù)器掛了,消息就丟失了,使用消息隊(duì)列可以避免消息丟失問(wèn)題(注意不是100%不丟失),就像快遞公司會(huì)保證你的物件寄到你的朋友手中,但肯定有丟件的幾率。
1.3RabbitMQRabbitMQ是用Erlang語(yǔ)言開(kāi)發(fā)的基于高級(jí)消息隊(duì)列協(xié)議(AMQP)的消息隊(duì)列中間件。
因?yàn)樗_(kāi)源,而且版本更新快,所以在國(guó)內(nèi)互聯(lián)網(wǎng)公司被廣泛使用。
其它使用的消息中間件還有ActiveMQ,RocketMQ,Kafka等,有興趣的同學(xué)可以自行研究。
還有2個(gè)專業(yè)術(shù)語(yǔ)要了解下:
生產(chǎn)者:發(fā)送消息的應(yīng)用程序被稱為生產(chǎn)者。
消費(fèi)者:接收消息的應(yīng)用程序被稱為消費(fèi)者。
2.RabbitMQ安裝及配置了解完基本概念,讓我們?cè)诒緳C(jī)上安裝下RabbitMQ,因?yàn)樗腔贓rlang語(yǔ)言開(kāi)發(fā)的,所以我們要先安裝Erlang。
2.1Erlang安裝及配置Erlang下載地址:www.erlang.org/downloads
因?yàn)槲业碾娔X是Windows 64位系統(tǒng),所以我下載的是64位的,系統(tǒng)是32位的同學(xué)注意下版本。
安裝過(guò)程比較簡(jiǎn)單,以下為部分截圖:
安裝完成后,需要新建個(gè)環(huán)境變量(打開(kāi)方式:計(jì)算機(jī)--右鍵--屬性--高級(jí)系統(tǒng)設(shè)置--高級(jí)--環(huán)境變量):
2.2RabbitMQ安裝及配置ERLANG_HOME E:Program Fileserl10.4(修改為你的安裝路徑)
RabbitMQ下載地址:www.rabbitmq.com/install-win…
安裝過(guò)程也比較簡(jiǎn)單,以下為部分截圖:
安裝完成后,在cmd窗口中執(zhí)行以下命令激活RabbitMQ Manage Plugin
"E:Program FilesRabbitMQ Server
abbitmq_server-3.7.15sbin
abbitmq-plugins.bat" enable rabbitmq_management
然后執(zhí)行命令重啟RabbitMQ服務(wù):
net stop RabbitMQ && net start RabbitMQ
如果你的cmd窗口不是以管理員身份打開(kāi)的,會(huì)出現(xiàn)如下報(bào)錯(cuò)信息
解決方法也很簡(jiǎn)單,以管理員身份打開(kāi)cmd窗口執(zhí)行命令即可
關(guān)于這一步,可以不使用命令重啟RabbitMQ服務(wù),而是打開(kāi)Windows的服務(wù)列表,找到RabbitMQ服務(wù),重啟即可。
到這一步,RabbitMQ的安裝就算完成了,其中有幾個(gè)默認(rèn)值,我們要知曉下:
默認(rèn)的端口號(hào):5672
默認(rèn)的用戶是guest guest
管理后臺(tái)的默認(rèn)端口號(hào):15672
瀏覽器輸入http://localhost:15672/,我們可以看到RabbitMQ的管理后臺(tái),然后使用默認(rèn)的guest賬號(hào)登錄,在這個(gè)后臺(tái),可以完成新建用戶,配置用戶角色,新建隊(duì)列等操作,當(dāng)然,如果有的同學(xué)比較喜歡命令行操作,也都有相對(duì)應(yīng)的命令來(lái)完成操作,關(guān)于這些內(nèi)容,后續(xù)多帶帶再寫博客講解。
3.Hello World示例
既然RabbitMQ環(huán)境安裝好了,那么我們通過(guò)1個(gè)簡(jiǎn)單的示例來(lái)看下效果。
首先在pom文件中,添加依賴:
<dependency>
<groupId>com.rabbitmqgroupId>
<artifactId>amqp-clientartifactId>
<version>5.7.0version>
dependency>
然后新建一個(gè)生產(chǎn)者類(Producer),用來(lái)新建一個(gè)隊(duì)列"hello",然后往隊(duì)列里發(fā)送消息‘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 {
// 創(chuàng)建連接
ConnectionFactory factory = new ConnectionFactory();
// 設(shè)置 RabbitMQ 的主機(jī)名
factory.setHost("localhost");
// 創(chuàng)建一個(gè)連接
Connection connection = factory.newConnection();
// 創(chuàng)建一個(gè)通道
Channel channel = connection.createChannel();
// 指定一個(gè)隊(duì)列,不存在的話自動(dòng)創(chuàng)建
channel.queueDeclare(QUEUE_NAME, false, false, false, null);
// 發(fā)送消息
String message = "Hello World!";
channel.basicPublish("", QUEUE_NAME, null, message.getBytes());
System.out.println(" [x] Sent "" + message + """);
// 關(guān)閉頻道和連接
channel.close();
connection.close();
}
}
運(yùn)行代碼,在RabbitMQ管理后臺(tái),會(huì)看到隊(duì)列新建成功,并且有1個(gè)消息待消費(fèi):
最后我們新建一個(gè)消費(fèi)者類(Consumer),用來(lái)消費(fèi)這個(gè)消息:
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 {
// 創(chuàng)建連接
ConnectionFactory factory = new ConnectionFactory();
// 設(shè)置 RabbitMQ 的主機(jī)名
factory.setHost("localhost");
// 創(chuàng)建一個(gè)連接
Connection connection = factory.newConnection();
// 創(chuàng)建一個(gè)通道
Channel channel = connection.createChannel();
// 指定一個(gè)隊(duì)列
channel.queueDeclare(QUEUE_NAME, false, false, false, null);
// 創(chuàng)建隊(duì)列消費(fèi)者
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);
}
}
運(yùn)行代碼,我們會(huì)發(fā)現(xiàn)控制臺(tái)輸出:
Received Message "Hello World!"
此時(shí)再看下RabbitMQ管理后臺(tái),會(huì)發(fā)現(xiàn)隊(duì)列"hello"待消費(fèi)的消息為0:
是不是覺(jué)得挺簡(jiǎn)單的呢,趕緊在本機(jī)安裝試試吧!
4.源碼源碼地址:github.com/zwwhnly/spr…,歡迎下載。
5.參考鏈接windows下 安裝 rabbitMQ 及操作常用命令
【譯】RabbitMQ 實(shí)戰(zhàn)教程(一) Hello World!
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/7184.html
摘要:基礎(chǔ)教程注本文是對(duì)眾多博客的學(xué)習(xí)和總結(jié),可能存在理解錯(cuò)誤。請(qǐng)帶著懷疑的眼光,同時(shí)如果有錯(cuò)誤希望能指出。安裝庫(kù)這里我們首先將消息推入隊(duì)列,然后消費(fèi)者從隊(duì)列中去除消息進(jìn)行消費(fèi)。 RabbitMQ 基礎(chǔ)教程(1) - Hello World 注:本文是對(duì)眾多博客的學(xué)習(xí)和總結(jié),可能存在理解錯(cuò)誤。請(qǐng)帶著懷疑的眼光,同時(shí)如果有錯(cuò)誤希望能指出。 如果你喜歡我的文章,可以關(guān)注我的私人博客:http:...
摘要:平均每個(gè)消費(fèi)者將得到相同數(shù)量的消息。消息確認(rèn)完成任務(wù)可能需要幾秒鐘。為了確保消息不會(huì)丟失,支持消息確認(rèn)。沒(méi)有任何消息超時(shí)當(dāng)這個(gè)消費(fèi)者中止了,將會(huì)重新分配消息時(shí)。這是因?yàn)橹皇钦{(diào)度消息時(shí),消息進(jìn)入隊(duì)列。 showImg(https://segmentfault.com/img/bVXNuN?w=332&h=111); 介紹 在上一個(gè) Hello World 教程中,我們編寫了從指定隊(duì)列發(fā)送...
摘要:在中間的框是一個(gè)隊(duì)列的消息緩沖區(qū),保持代表的消費(fèi)。本教程介紹,這是一個(gè)開(kāi)放的通用的協(xié)議消息。我們將在本教程中使用,解決依賴管理。發(fā)送者將連接到,發(fā)送一條消息,然后退出。注意,這與發(fā)送發(fā)布的隊(duì)列匹配。 介紹 RabbitMQ是一個(gè)消息代理器:它接受和轉(zhuǎn)發(fā)消息。你可以把它當(dāng)作一個(gè)郵局:當(dāng)你把郵件放在信箱里時(shí),你可以肯定郵差先生最終會(huì)把郵件送到你的收件人那里。在這個(gè)比喻中,RabbitMQ就...
摘要:每當(dāng)我們收到一條消息,這個(gè)回調(diào)函數(shù)就被皮卡庫(kù)調(diào)用。接下來(lái),我們需要告訴這個(gè)特定的回調(diào)函數(shù)應(yīng)該從我們的隊(duì)列接收消息為了讓這個(gè)命令成功,我們必須確保我們想要訂閱的隊(duì)列存在。生產(chǎn)者計(jì)劃將在每次運(yùn)行后停止歡呼我們能夠通過(guò)發(fā)送我們的第一條消息。 源碼:https://github.com/ltoddy/rabbitmq-tutorial 介紹 RabbitMQ是一個(gè)消息代理:它接受和轉(zhuǎn)發(fā)消息。你...
摘要:然而實(shí)際業(yè)務(wù)中還存在另外一種定時(shí)任務(wù),它可能需要一些觸發(fā)條件才開(kāi)始定時(shí),比如編寫博文時(shí)候,設(shè)置小時(shí)之后發(fā)送。在消息監(jiān)聽(tīng)類中,對(duì)通道定義了,這里會(huì)對(duì)延遲消息做具體的邏輯。由于消息的消費(fèi)是延遲的,從而變相實(shí)現(xiàn)了從消息發(fā)送那一刻起開(kāi)始的定時(shí)任務(wù)。 應(yīng)用場(chǎng)景 我們?cè)谑褂靡恍╅_(kāi)源調(diào)度系統(tǒng)(比如:elastic-job等)的時(shí)候,對(duì)于任務(wù)的執(zhí)行時(shí)間通常都是有規(guī)律性的,可能是每隔半小時(shí)執(zhí)行一次,或者...
閱讀 3052·2021-10-14 09:43
閱讀 3068·2021-10-14 09:42
閱讀 4927·2021-09-22 15:56
閱讀 2475·2019-08-30 10:49
閱讀 1653·2019-08-26 13:34
閱讀 2564·2019-08-26 10:35
閱讀 673·2019-08-23 17:57
閱讀 2150·2019-08-23 17:15