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