Java研學-RabbitMQ(三)

一 消息通信協議

1 AMQP

??AMQP 是一個開放的、跨語言、跨平臺的消息協議標準,用于在分布式系統中傳遞業務消息。它定義了消息隊列的二進制協議格式和交互模型(如交換機、隊列、綁定等),確保不同語言(Java、Python、C#等)和平臺(RabbitMQ、Qpid等)的實現能夠互操作。

2 Spring AMQP

??Spring AMQP 是 Spring 框架對 AMQP 協議(如 RabbitMQ)的抽象與封裝,提供了一套簡潔的 Java API 來簡化消息的生產和消費。
??它通過AmqpTemplate模板類實現消息的快速發送(如自動序列化、路由鍵設置),結合@RabbitListener注解實現聲明式的消費者監聽,同時支持動態聲明交換機、隊列和綁定(通過 RabbitAdmin),并深度集成 Spring 生態(如依賴注入、事務管理)。
??其核心優勢在于隱藏底層協議細節,讓開發者僅需關注業務邏輯,無需手動處理連接、通道或消息確認等復雜操作,從而高效構建異步、解耦的分布式系統。

二 入門demo

1 項目路徑圖

在這里插入圖片描述

2 交換機與隊列準備

??創建虛擬主機/midhuang,使用其中的交換機amq.fanout,與隊列xiaohuang.queue1進行綁定。

3 父工程導入依賴

??創建spring項目,為父工程導入依賴,兩個子工程會會自動繼承這些依賴

        <!-- Lombok:簡化Java代碼(如自動生成Getter/Setter--><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency><!-- Spring AMQP + RabbitMQ 集成 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-amqp</artifactId></dependency><!-- Spring Boot 單元測試 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency>

4 各個微服務中配置文件

??① consumer(消費者),5672是用來發消息的端口,15672是Web控制臺

spring:rabbitmq:host: 192.168.44.128port: 5672 virtual-host: /midhuangusername: dahuangpassword: "dahuang66"
logging:level:cn.tj.consumer.listeners: DEBUG # 設置為 DEBUG 以查看詳細日志

??② publisher(生產者)

spring:rabbitmq:host: 192.168.44.128port: 5672virtual-host: /midhuangusername: dahuangpassword: "dahuang66"
logging:level:cn.tj: DEBUG # 設置為 DEBUG 以查看詳細日志

5 測試類發送消息

??利用RabbitTemplate發送消息

@SpringBootTest
class PublisherApplicationTests {// 注入 RabbitTemplate@Autowiredprivate RabbitTemplate rabbitTemplate;// 直接發送消息到隊列@Testpublic void testHuangQueue() {// 1. 定義隊列名稱String queueName = ".queue";// 2. 定義消息內容String message = "hello, spring amqp!";// 3. 發送消息(默認路由到隊列)rabbitTemplate.convertAndSend(queueName, message);System.out.println("消息發送成功: " + message);}
}

6 控制臺檢查剛剛發送消息

在這里插入圖片描述

7 接收消息

??利用@RabbitListener注解聲明要監聽的隊列,監聽消息,此時消費者服務需啟動保持監聽狀態

@Slf4j
@Component
public class MqListener {@RabbitListener(queues = "xiaohuang.queue1")public void listenHuangQueue(String msg) {log.info("收到消息: {}", msg);// 調試:打印消息長度和字節(如果 msg 為 null,會輸出 "null")log.debug("消息長度: {}, 內容: {}", msg == null ? "null" : msg.length(), msg);}
}

三 Workqueues

??Workqueues(工作隊列)是一種常見的任務分發模型,將多個消費者綁定到一個隊列,共同消費隊列中的消息,通過共享隊列實現負載均衡,從而解決消息堆積問題。

1 創建隊列 work.queue

在這里插入圖片描述

2 添加兩個消費者 – MqListener

@Slf4j
@Component
public class MqListener {@RabbitListener(queues = "work.queue")public void listenWorkQueue1(String msg) {log.info("1號消費者收到消息: {}", msg);}@RabbitListener(queues = "work.queue")public void listenWorkQueue2(String msg) {log.info("2號消費者收到消息: {}", msg);}
}

3 生產者連續發送消息 – PublisherApplicationTests

@SpringBootTest
class PublisherApplicationTests {// 注入 RabbitTemplate@Autowiredprivate RabbitTemplate rabbitTemplate;@Testvoid testWorkQueue() throws InterruptedException {String queueName = "work.queue";// 發送50條測試消息for (int i = 1; i <= 40; i++) {String msg = "hello" + i;rabbitTemplate.convertAndSend(queueName, msg);System.out.println(" [x] Sent '" + msg + "'");Thread.sleep(30); // 模擬延遲,避免消息爆發}}
}

4 控制臺輸出

??此時并未考慮到消費者的處理能力,RabbitMQ 默認使用 輪詢(Round-Robin) 策略分發消息,這可能導致某些消費者積壓大量未處理消息,而其他消費者空閑。
在這里插入圖片描述

5 編寫配置文件 – consumer

??prefetchCount:1像外賣小哥一次只接一單,平臺會一次性給小哥派5 個訂單(即使他還沒處理完之前的訂單)。如果小哥手慢(比如堵車),這 5 個訂單都會卡在他手里,其他空閑的小哥卻沒訂單可接。
??啟用prefetchCount:1后:平臺每次只給小哥派 1 個訂單。小哥必須完成這個訂單(送到顧客手里),平臺才會派下一個訂單。如果小哥 A 處理快,他很快能接下一個訂單;小哥 B 處理慢,他手頭的訂單不會影響別人。

spring:rabbitmq:host: 192.168.44.128port: 5672virtual-host: /midhuangusername: dahuangpassword: "dahuang66"listener:simple:prefetch: 1
logging:level:cn.tj.consumer.listeners: DEBUG # 設置為 DEBUG 以查看詳細日志

6 設置消費者處理速度 – MqListener

@Slf4j
@Component
public class MqListener {@RabbitListener(queues = "work.queue")public void listenWorkQueue1(String msg) throws InterruptedException {log.info("1號消費者收到消息: {}", msg);Thread.sleep(20);}@RabbitListener(queues = "work.queue")public void listenWorkQueue2(String msg) throws InterruptedException {log.debug("2號消費者收到消息: {}", msg);Thread.sleep(200);}
}

7 控制臺輸出

在這里插入圖片描述

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

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

相關文章

http.client 教程-如何使用 Python 標準庫發送 HTTP 請求

http.client 教程-如何使用 Python 標準庫發送 HTTP 請求以下是 http.client 模塊的詳細使用教程&#xff0c;幫助你理解如何使用 Python 標準庫發送 HTTP 請求&#xff1a;1. http.client 概述http.client 是 Python 內置的 HTTP 客戶端庫&#xff0c;提供了底層的 HTTP 協議實…

Android-三種持久化方式詳解

持久化技術分為3種&#xff0c;文件&#xff0c;sharedPreferences存儲&#xff0c;數據庫來存儲&#xff1b; 目錄 文件存儲&#xff1a; 利用SharedPreferences中讀取數據 SQLite創建數據庫 更新 添加 刪除 查找&#xff1a; 文件存儲&#xff1a; 文件存儲是 Andr…

并發安全之鎖機制一

鎖機制一 鎖機制是計算機系統中解決并發沖突的核心工具&#xff0c;其存在和應用場景源于一個根本問題&#xff1a;當多個執行單元&#xff08;線程、進程、分布式節點&#xff09;同時訪問或修改同一份共享資源時&#xff0c;如何保證數據的正確性、一致性和系統可靠性&#x…

結合項目闡述 設計模式:單例、工廠、觀察者、代理

原文鏈接&#xff1a;https://download.csdn.net/blog/column/12433305/133862792#_1613 1、工廠模式應用 C17及之后可編譯 /*日志落地模塊的實現1.抽象落地基類2.派生子類&#xff08;根據不同落地方向進行派生&#xff09;3.使用工廠模式進行創建與表示的分離 */#ifndef _…

uniapp 更新apk有緩存點不動,卸載安裝apk沒有問題。android

方式一。pages.json&#xff1a;"globalStyle" : {"navigationBarTextStyle" : "black","navigationBarTitleText" : "uni-app","navigationBarBackgroundColor" : "#F8F8F8","backgroundColor&qu…

HTML響應式SEO公司網站源碼

核心優勢 100%純HTML/CSS開發自動適配手機/平板/PC內置SEO優化結構0.5秒極速加載 包含頁面 ? 首頁&#xff08;關鍵詞布局優化版&#xff09; ? 服務項目展示頁 ? 客戶案例庫 ? 新聞資訊系統 ? 聯系方式&#xff08;帶地圖API&#xff09; 技術參數 兼容Chrome/Firefo…

Error: llama runner process has terminated: exit status 2

我是i7 12700h ,3080顯卡&#xff0c;在 Windows 11 上運行 ollama run deepseek-r1:1.5b 出現 Error: llama runner process has terminated: exit status 2 之前是好用的&#xff0c;后來不知為什么就不好用了。 原因&#xff1a; 檢查 Microsoft Visual C Redistributab…

Linux中ssh遠程登錄原理與配置

SSH連接的五個階段 1. 版本協商階段&#xff08;Protocol Version Negotiation&#xff09;目的&#xff1a;協商使用SSH-1或SSH-2協議&#xff08;現代系統默認SSH-2&#xff09;。流程&#xff1a;關鍵點&#xff1a;若版本不兼容&#xff08;如客戶端只支持SSH-1&#xff0c…

Kubernetes --存儲入門

一、Volume 的概念對于大多數的項目而言&#xff0c;數據文件的存儲是非常常見的需求&#xff0c;比如存儲用戶上傳的頭像、文件以及數據庫的數據。在 Kubernetes 中&#xff0c;由于應用的部署具有高度的可擴展性和編排能力&#xff08;不像傳統架構部署在固定的位置&#xff…

螞蟻 KAG 框架開源:知識圖譜 + RAG 雙引擎

引言&#xff1a;從RAG到KAG&#xff0c;專業領域知識服務的技術突破 在大語言模型&#xff08;LLM&#xff09;應用落地過程中&#xff0c;檢索增強生成&#xff08;RAG&#xff09; 技術通過引入外部知識庫有效緩解了模型幻覺問題&#xff0c;但在專業領域仍面臨三大核心挑戰…

V-Ray 7.00.08 for 3ds Max 2021-2026 安裝與配置教程(含語言補丁)

本文介紹 V-Ray 7.00.08 渲染器在 3ds Max 2021-2026 各版本中的安裝與使用配置步驟&#xff0c;適合需要進行可視化渲染工作的設計師、建筑師及相關從業者。附帶語言補丁配置方式&#xff0c;幫助用戶獲得更順暢的使用體驗。 &#x1f4c1; 一、安裝文件準備 軟件名稱&#xf…

Go-Elasticsearch Typed Client查詢請求的兩種寫法強類型 Request 與 Raw JSON

1 為什么需要兩種寫法&#xff1f; 在 Golang 項目中訪問 Elasticsearch&#xff0c;一般會遇到兩類需求&#xff1a;需求場景特點最佳寫法后臺服務 / 業務邏輯查詢固定、字段清晰&#xff0c;需要編譯期保障Request 結構體儀表盤 / 高級搜索 / 模板 DSL查詢片段由前端或腳本動…

Leaflet 綜合案例-聚類圖層控制

看過的知識不等于學會。唯有用心總結、系統記錄&#xff0c;并通過溫故知新反復實踐&#xff0c;才能真正掌握一二 作為一名摸爬滾打三年的前端開發&#xff0c;開源社區給了我飯碗&#xff0c;我也將所學的知識體系回饋給大家&#xff0c;助你少走彎路&#xff01; OpenLayers…

React組件中的this指向問題

在 React 組件中&#xff0c;函數定義方式影響this指向的核心原因是箭頭函數與普通函數的作用域綁定規則不同&#xff0c;具體差異如下&#xff1a;? 1. 普通函數&#xff08;function定義&#xff09;需要手動bind(this)的原因? 當用function在組件內定義方法時&#xff1…

Vue 項目中的組件引用如何實現,依賴組件間的數據功能交互及示例演示

在 Vue 項目中&#xff0c;組件間的引用與數據交互是核心功能之一。以下是組件引用和數據交互的詳細實現方式及示例&#xff1a;一、組件引用方式 1. 基本組件引用 局部注冊&#xff1a;在父組件中按需引入子組件并注冊。 // ParentComponent.vue import ChildComponent from .…

? 使用 Flask 實現頭像文件上傳與加載功能

文章目錄&#x1f9f1; 技術棧&#x1f5c2;? 項目結構與配置&#x1f510; 用戶身份校驗邏輯&#x1f4e4; 頭像上傳接口&#xff1a;/file/avatar/upload&#x1f4e5; 加載頭像接口&#xff1a;/file/avatar/load/<filename>&#x1f9ea; 示例請求&#xff08;使用 …

去除視頻字幕 5: 使用 ProPainter, 記錄探索過程

使用 ProPainter 去除視頻上的字幕&#xff0c;效果演示&#xff08;比之前好多了。&#xff09;。 1. 項目目標 去除視頻 (bear.webm) 中的硬字幕。 2. 初始嘗試與關鍵失敗&#xff1a;IOPaint 方法: 使用 IOPaint&#xff08;一個圖像修復工具&#xff09;配合 PaddleOCR 逐…

JavaScript HTTP 請求:從老古董到新潮流

前端開發離不開跟后端打交道&#xff0c;HTTP 請求就是這座橋梁。JavaScript 提供了好幾種方式來發請求&#xff0c;從老牌的 XMLHttpRequest (XHR) 到現代的 Fetch API&#xff0c;再到各種好用的第三方庫&#xff08;像 Axios、Ky、Superagent&#xff09;。咱們一個一個聊清…

Windows10系統使用Cmake4.1.0構建工具+Visual Studio2022編譯Opencv4.11教程

安裝提示 后續安裝本Cmake和Opencv版本及以上都可以。Microsoft Visual Studio2022已默認安裝&#xff0c;沒有安裝給出教程鏈接。 一、Cmake4.1.0下載 1.官網下載&#xff1a;https://cmake.org/download/&#xff0c;找到cmake-4.1.0-rc3-windows-x86_64.zip版本 2.壓縮包…

【性能測試】Jmeter+Grafana+InfluxDB+Prometheus Windows安裝部署教程

一、工具作用與整體架構 1.1 各工具核心作用 工具作用描述關鍵特性Jmeter性能測試工具&#xff0c;模擬多用戶并發請求&#xff0c;生成測試數據支持HTTP/HTTPS、數據庫等多種協議&#xff0c;可自定義測試場景InfluxDB時序數據庫&#xff0c;專門存儲時間序列數據&#xff0…