簡單入門RabbitMQ

本章將帶大家來寫一個簡單的程序,使用 Java 創建RabbitMQ 的生產者和消費者

依賴引入

在 Maven 倉庫中輸入 amqp-client:
在這里插入圖片描述

找到第一個 RabbitMQ Java Client ,點擊進去找到一個合適的版本然后將依賴引入到我們項目中的 pom.xml 文件中。

生產者代碼編寫

首先我們來回顧 RabbitMQ 的工作流程:
在這里插入圖片描述

我們首先要建立連接Connection,通過 ConnectionFactory 來創建一個連接,在建立連接前我們需要設置好RabbitMQ 的參數:主機、端口號、用戶名、密碼、綁定的虛擬機。

		//建立連接ConnectionFactory factory = new ConnectionFactory();factory.setHost(Constants.HOST);factory.setPort(Constants.PORT);factory.setUsername(Constants.NAME);factory.setPassword(Constants.PASSWORD);factory.setVirtualHost(Constants.VIRTUAL_HOST);Connection connection = factory.newConnection();

接著我們需要開啟信道 Channel,因為我們的Connection 是抽象的虛擬連接,并不是真正和RabbitMQ 虛擬機進行了連接,我們需要Connection 上的信道來進行通信:

		//開啟信道Channel channel = connection.createChannel();

聲明交換機,當我們沒有顯式地聲明交換機的話,RabbitMQ 會使用默認的交換機,RabbitMQ默認會為每個連接自動創建一個名為 “”(空字符串)的直連交換機(Direct Exchange),所有隊列都會隱式綁定到該交換機,綁定的路由鍵(Routing Key)就是隊列名稱。


聲明隊列:

//聲明隊列,使用內置的交換機,如果隊列不存在會自動幫我們創建
channel.queueDeclare(Constants.HELLO_QUEUE, true, false, true, null);

參數介紹:

Queue.DeclareOk queueDeclare(String queue,
boolean durable, 
boolean exclusive, 
boolean autoDelete,
Map<String, Object> arguments) throws IOException;

queue: 隊列名稱

durable: 表示是否需要持久化,true 說明需要持久化,那么我們發送的消息就會進行落盤操作,如果RabbitMQ 重啟了也可以找到這個消息,即把消息保存在硬盤中,如果是 false ,表示不需要進行持久化操作,那么我們發送的消息就只會在內存中,如果 RabbitMQ 重啟了,消息也就不見了。

exclusive:表示是否獨占,true: 表示該隊列只對它的連接可見,且連接關閉時隊列自動刪除。
適用于臨時場景(如RPC回調隊列),確保隊列不被其他連接共享。
注意:若其他連接嘗試使用排他隊列,會拋異常。

autoDelete:表示是否自動刪除,true:當最后一個消費者取消訂閱(如斷開連接)時,隊列自動刪除。適用于動態隊列(如臨時任務隊列),無需手動清理。
注意:若隊列從未有過消費者,則不會觸發刪除。

arguments:設置隊列的高級參數,在后面的章節中會詳細展開。


發送消息:

for (int i = 0; i < 10; i++) {String msg = "hello work queue...." + i;channel.basicPublish("",Constants.HELLO_QUEUE, null, msg.getBytes());
}

參數說明:

void basicPublish(String exchange, 
String routingKey, 
BasicProperties props, 
byte[] body) throws IOException;

exchange:交換機的名稱,由于上面我們沒有聲明交換機,所以這里填 “” 【空字符串】表示默認交換機

routingKey:路由鍵,也就說消息要發送到哪個隊列上,路由鍵即為標識,在下一章節中會詳細介紹。

props:屬性配置,這個在后面的章節中也會介紹

body:消息內容


資源釋放:

//6. 資源釋放
channel.close();
connection.close();

這里我們先釋放信道,然后再釋放連接。

注意:釋放連接之后,就不能釋放信道了!!!因為連接都不存在了,信道也不會存在。
因此你也可以只釋放連接。


運行程序之后,我們打開 RabbitMQ 的面板:
在這里插入圖片描述

會發現我們成功將十條消息發送到隊列中

在這里插入圖片描述

通過輸入Messages 數量,然后點擊 Get Message(s),就可以查看消息的詳細信息了。

消費者代碼編寫

和生產者類似,都需要先設置好虛擬機的參數,然后創建連接,創建信道:

//建立連接
ConnectionFactory factory = new ConnectionFactory();
factory.setHost(Constants.HOST);
factory.setPort(Constants.PORT);
factory.setUsername(Constants.NAME);
factory.setPassword(Constants.PASSWORD);
factory.setVirtualHost(Constants.VIRTUAL_HOST);
Connection connection = factory.newConnection();
//開啟信道
Channel channel = connection.createChannel();

聲明隊列:

//聲明隊列
channel.queueDeclare(Constants.HELLO_QUEUE, true, false, true, null);

為什么消費者需要聲明隊列?
因為消費者要消費的前提是有隊列可以消費
在分布式系統中,生產者和消費者的代碼可能不會在同一臺機器上,如果生產者還沒有啟動,反而消費者先啟動了,消費者就會拋出異常,找不到隊列
因此為了避免發生上面的異常情況,我們也需要在消費者中聲明隊列,這樣,如果沒有隊列的話,RabbitMQ 就會幫我們創建隊列出來。


接收消息和處理消息:

DefaultConsumer consumer = new DefaultConsumer(channel){
@Override
public void handleDelivery(String consumerTag, 
Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {System.out.println("接收到的消息:" + new String(body));}
};
channel.basicConsume(Constants.HELLO_QUEUE, true, consumer);

處理消息的主邏輯我們通過 DefaultConsumer 來進行編寫,通過重寫 handleDelivery 方法,來實現我們需要的邏輯。

參數介紹:

/*** No-op implementation of {@link Consumer#handleDelivery}.*/
@Override
public void handleDelivery(String consumerTag,Envelope envelope,AMQP.BasicProperties properties,byte[] body)throws IOException
{// no work to do
}

consumerTag :消費者表示,用于區分消費者,就像我們的身份證一樣

envelope:消息的元數據包裝對象。

properties:消息的附加屬性(元數據)

body:消息內容


最后我們可以不主動釋放連接,這樣我們就可以看到完整的打印信息了

RabbitMQ 的 Java 客戶端底層使用 ExecutorService 管理消費者線程。
這些線程默認是守護線程,因此主線程【main】結束后,它們會被 JVM 強制終止。

由于RabbitMQ 線程和 main 線程屬于多線程,因此根據多線程知識,我們可以知道如果主動釋放連接的話,main 線程就是立即結束,我們可能就看不到完整的信息了。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/81340.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/81340.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/81340.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Git基礎使用方法與命令總結

Git 是一個分布式版本控制系統&#xff0c;用于跟蹤代碼或文件的修改歷史。以下是 Git 的基礎使用方法和常用命令&#xff0c;適合快速上手&#xff1a; 1. 安裝與配置 安裝 Git 下載地址&#xff1a;https://git-scm.com/downloads&#xff08;支持 Windows/macOS/Linux&…

Oracle SYSTEM/UNDO表空間損壞的處理思路

Oracle SYSTEM/UNDO表空間損壞是比較棘手的故障&#xff0c;通常會導致數據庫異常宕機進而無法打開數據庫。數據庫的打開故障處理起來相對比較麻煩&#xff0c;讀者可以參考本書第5章進一步了解該類故障的處理過程。如果數據庫沒有備份&#xff0c;通常需要設置官方不推薦的隱含…

The Graph:區塊鏈數據索引的技術架構與創新實踐

作為Web3生態的核心基礎設施&#xff0c;The Graph通過去中心化索引協議重塑了鏈上數據訪問的范式。其技術設計不僅解決了傳統區塊鏈數據查詢的效率瓶頸&#xff0c;還通過經濟模型與多鏈兼容性構建了一個開放的開發者生態。本文從技術角度解析其架構、機制及創新實踐。 一、技…

在24GB顯存大小的GPU上運行27GB的Pytorch模型

在24GB顯存大小的GPU上運行27GB的Pytorch模型 一.背景:顯存不足時的破局之道1.1 大模型時代的顯存困境1.2 CUDA統一內存的魔法二.性能測試數據深度解讀關鍵發現:三.復現過程3.1 準備自定義分配器3.2 準備測試程序3.3 執行流程3.4 開始測試四.原理深度剖析4.1 統一內存的工作機…

Spring Boot 參數驗證

一、依賴配置 首先確保在 pom.xml 中添加了以下依賴&#xff1a; <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-validation</artifactId> </dependency> 這個依賴包含了 Hibernate Valida…

SHAP分析!Transformer-GRU組合模型SHAP分析,模型可解釋不在發愁!

SHAP分析&#xff01;Transformer-GRU組合模型SHAP分析&#xff0c;模型可解釋不在發愁&#xff01; 目錄 SHAP分析&#xff01;Transformer-GRU組合模型SHAP分析&#xff0c;模型可解釋不在發愁&#xff01;效果一覽基本介紹程序設計參考資料 效果一覽 基本介紹 基于SHAP分析…

在微創手術中使用Kinova輕型機械臂進行多視圖圖像采集和3D重建

在微創手術中&#xff0c;Kinova輕型機械臂通過其靈活的運動控制和高精度的操作能力&#xff0c;支持多視圖圖像采集和3D重建。這種技術通過機械臂搭載的光學系統實現精準的多角度掃描&#xff0c;為醫療團隊提供清晰且詳細的解剖結構模型。其核心在于結合先進的傳感器配置與重…

Qt事件循環機制

受事件循環機制影響&#xff0c;按鈕的樣式表改變了可能不會立即刷新。 需要使用 update() 或 repaint() 或者調用 QApplication::processEvents() 強制處理所有待處理的事件&#xff0c;從而確保界面更新。 在 Qt 中&#xff0c;事件循環&#xff08;Event Loop&#xff09;是…

Leaflet 自定義瓦片地圖與 PHP 大圖切圖算法 解決大圖沒辦法在瀏覽器顯示的問題

為什么使用leaflet 使用 Leaflet 來加載大圖片&#xff08;尤其是通過瓦片化的方式&#xff09;是一種高效的解決方案&#xff0c;主要原因如下&#xff1a; 1. 性能優化 減少內存占用&#xff1a;直接加載大圖片會占用大量內存&#xff0c;可能導致瀏覽器崩潰或性能下降。瓦片…

一種應用非常廣泛的開源RTOS(實時操作系統):nuttx

什么是NuttX&#xff1f; NuttX&#xff08;讀音接近“納特-艾克斯”&#xff09;是一種應用非常廣泛的開源RTOS&#xff08;實時操作系統&#xff09;&#xff0c;由Gregory Nutt博士主要推動開發。RTOS&#xff0c;即 Real-Time Operating System&#xff0c;直譯為“實時操…

Python中plotext 庫詳細使用(命令行界面中直接繪制各種圖形)

更多內容請見: python3案例和總結-專欄介紹和目錄 文章目錄 plotext概述1.1 plotext介紹1.2 安裝二、基本用法2.1 簡單繪圖2.2 散點圖2.3 折線圖2.4 條形圖2.5 直方圖2.6 標題和坐標軸標簽2.7 網格和坐標軸2.8 顏色和樣式2.9 多圖疊加三、高級功能3.1 多圖繪制3.2 對數坐標3.3…

使用 ESP32 驅動 ±12V 壓電無源蜂鳴器(NPN 三極管 + PWM 控制驅動電路)

&#x1f50a; 使用 ESP32 驅動 12V 壓電無源蜂鳴器&#xff08;NPN 三極管 PWM 控制驅動電路&#xff09; 本教程將介紹如何使用 ESP32 控制一個額定工作電壓為 12V 的壓電無源蜂鳴器&#xff0c;通過 NPN 三極管 PWM 信號實現音量更大的驅動方案。 &#x1f9e0; 教程目標…

python調用金蝶api接口

金蝶接口 登錄接口 https://xxx.xxx.com/k3cloud/Kingdee.BOS.WebApi.ServicesStub.AuthService.ValidateUser.common.kdsvc 查詢單據接口 https://xxx.xxx.com/K3Cloud/Kingdee.BOS.WebApi.ServicesStub.DynamicFormService.ExecuteBillQuery.common.kdsvc 基礎資料保存接口、…

12 web 自動化之基于關鍵字+數據驅動-反射自動化框架搭建

文章目錄 一、如何實現一條用例&#xff0c;實現覆蓋所有用例的測試1、結合數據驅動&#xff1a;編輯一條用例&#xff0c;外部導入數據實現循環測試2、用例體&#xff1a;實現不同用例的操作步驟對應的斷言 二、實戰1、項目路徑總覽2、common 文件夾下的代碼文件3、keywords 文…

Ubuntu shell指定conda的python環境啟動腳本

Ubuntu shell指定conda的python環境啟動腳本。 通過指令&#xff0c;獲取目前系統的conda虛擬python環境 conda info -e 如下圖所示&#xff0c;為我自己電腦的python環境 # conda environments: # base * /home/ubuntu/miniconda3 kitti …

博客系統技術需求文檔(基于 Flask)

以下內容是AI基于要求生成的技術文檔&#xff0c;僅供參考~ &#x1f9f1; 一、系統架構設計概覽 層級 內容 前端層 HTML Jinja2 模板引擎&#xff0c;集成 Markdown 編輯器、代碼高亮 后端層 Flask 框架&#xff0c;RESTful 風格&#xff0c;Jinja2 渲染 數據庫 SQLi…

【Linux 學習計劃】-- 權限

目錄 權限是什么 權限的本質 權限&#xff08;用戶&#xff09;的修改 權限的匹配機制 目錄的權限 初始權限&#xff08;文件和目錄&#xff09; 粘滯位 結語 權限是什么 在現實世界中就有權限的概念&#xff0c;也就是&#xff0c;一部分人能做但是其他沒有相關身份的…

okcc呼叫中心系統搭建的方案方式

傳統企業呼叫中心多采用 PC和手機軟件&#xff0c;很難與客戶保持良好的溝通。因此&#xff0c;需要建設一套呼叫中心系統來實現與客戶實時有效溝通。那么&#xff0c;呼叫中心搭建的方案方式有哪些呢?下面詳細介紹一下。 呼叫中心系統的搭建方式需根據企業規模、預算和業務需…

前端最新面試題及答案 (2025)

前端最新面試題及答案 (2025) JavaScript 核心 1. ES6+ 新特性 問題: 請解釋 ES6 中 let/const 與 var 的區別,以及箭頭函數的特點。 答案: let/const vs var: 作用域: let/const 是塊級作用域,var 是函數作用域 變量提升: var會提升變量,let/const不會(有暫時性死區) 重…

傳統輪椅逆襲!RDK + 激光雷達如何重塑出行體驗?

為滿足特殊群體智能化出行需求&#xff0c;攻克傳統輪椅技術短板&#xff0c;本項目研發了一款智能輪椅。該輪椅借助攝像頭與激光雷達&#xff0c;精準感知環境、檢測障礙物&#xff1b;融合激光 SLAM 技術和互聯網地圖&#xff0c;實現室內外無縫導航與自主避障&#xff1b;提…