RabbitMQ高級特性--發送方確認

目錄

1. confirm確認模式

1.配置RabbitMQ

2.設置確認回調邏輯并發送消息

2.Return退回模式

1.配置RabbitMQ

2.設置返回回調邏輯并發送消息


在使用RabbitMQ的時候, 可以通過消息持久化來解決因為服務器的異常崩潰而導致的消息丟失, 但是還有?個問題, 當消息的生產者將消息發送出去之后, 消息到底有沒有正確地到達服務器呢? 如果在消息到達服務器之前已經丟失(比如RabbitMQ重啟, 那么RabbitMQ重啟期間生產者消息投遞失敗), 持久化操作也解決不了這個問題,因為消息根本沒有到達服務器,何談持久化?
RabbitMQ為我們提供了兩種解決方案:
? ?
? ? ? 1. 通過事務機制實現
? ? ? 2. 通過發送方確認機制實現
事務機制比較消耗性能,咱們主要介紹confirm機制來實現發送方的確認。
RabbitMQ為我們提供了兩個方式來控制消息的可靠性投遞:
? ? ? 1. confirm確認模式
? ? ? 2. return退回模式

1. confirm確認模式

Producer 在發送消息的時候, 對發送端設置?個ConfirmCallback的監聽, ?論消息是否到達
Exchange, 這個監聽都會被執行, 如果Exchange成功收到, ACK( Acknowledge character , 確認
字符)為true, 如果沒有收到,則ACK為false。
步驟如下:

1.配置RabbitMQ

spring:rabbitmq:addresses: amqp://study:study@你的服務器IP:15673/你的虛擬機名listener:simple:acknowledge-mode: manual #消息接收確認publisher-confirm-type: correlated #消息發送確認

2.設置確認回調邏輯并發送消息

無論消息確認成功還是失敗, 都會調用ConfirmCallback的confirm方法. 如果消息成功發送到Broker,
ack為true.
如果消息發送失敗, ack為false, 并且cause提供失敗的原因
@Bean("confirmRabbitTemplate")
public RabbitTemplate confirmRabbitTemplate(ConnectionFactory 
connectionFactory){RabbitTemplate rabbitTemplate = new RabbitTemplate(connectionFactory);rabbitTemplate.setConfirmCallback(new RabbitTemplate.ConfirmCallback() {@Overridepublic void confirm(CorrelationData correlationData, boolean ack, 
String cause) {System.out.printf("");if (ack){System.out.printf("消息接收成功, id:%s \n", 
correlationData.getId());}else {System.out.printf("消息接收失敗, id:%s, cause: %s", 
correlationData.getId(), cause);}}});return rabbitTemplate;
}@Resource(name = "confirmRabbitTemplate")
private RabbitTemplate confirmRabbitTemplate;
@RequestMapping("/confirm")
public String confirm() throws InterruptedException CorrelationData correlationData1 = new CorrelationData("1");confirmRabbitTemplate.convertAndSend(Constant.CONFIRM_EXCHANGE_NAME, 
"confirm", "confirm test...", correlationData1);return "確認成功";
}

方法說明:

public interface ConfirmCallback {/*** 確認回調* @param correlationData: 發送消息時的附加信息, 通常?于在確認回調中識別特定的消
息* @param ack: 交換機是否收到消息, 收到為true, 未收到為false* @param cause: 當消息確認失敗時,這個字符串參數將提供失敗的原因.這個原因可以?于調
試和錯誤處理.* 成功時, cause為null */void confirm(@Nullable CorrelationData correlationData, boolean ack, 
@Nullable String cause);
}

RabbitTemplate.ConfirmCallback 和 ConfirmListener 區別
在RabbitMQ中, ConfirmListener和ConfirmCallback都是?來處理消息確認的機制, 但它們屬于不同
的客戶端庫, 并且使用的場景和方式有所不同.
1 . ConfirmListener 是 RabbitMQ Java Client 庫中的接口. 這個庫是 RabbitMQ 官?提供的?個直
接與RabbitMQ服務器交互的客戶端庫. ConfirmListener 接?提供了兩個方法: handleAck 和
handleNack, ?于處理消息確認和否定確認的事件.
2 . ConfirmCallback 是 Spring AMQP 框架中的?個接口. 專門為Spring環境設計. 用于簡化與
RabbitMQ交互的過程. 它只包含?個 confirm 方法,?于處理消息確認的回調.
在 Spring Boot 應?中, 通常會使用?ConfirmCallback, 因為它與 Spring 框架的其他部分更加整合, 可以利用Spring 的配置和依賴注入功能. 而在使用?RabbitMQ Java Client 庫時, 則可能會直接實現
ConfirmListener 接口, 更直接的與RabbitMQ的Channel交互

2.Return退回模式

消息到達Exchange之后, 會根據路由規則匹配, 把消息放?Queue中. Exchange到Queue的過程, 如果?條消息無法被任何隊列消費(即沒有隊列與消息的路由鍵匹配或隊列不存在等), 可以選擇把消息退回給發送者. 消息退回給發送者時, 我們可以設置一個返回回調方法,對消息進行處理

步驟如下:

1.配置RabbitMQ

spring:rabbitmq:addresses: amqp://study:study@你的服務器IP:15673/你的虛擬機名listener:simple:acknowledge-mode: manual #消息接收確認publisher-confirm-type: correlated #消息發送確認

2.設置返回回調邏輯并發送消息

消息無法被路由到任何隊列,它將返回給發送者,這時setReturnCallback設置的回調將被觸發

@Bean("confirmRabbitTemplate")
public RabbitTemplate confirmRabbitTemplate(CachingConnectionFactory 
connectionFactory){RabbitTemplate rabbitTemplate = new RabbitTemplate(connectionFactory);rabbitTemplate.setMandatory(true);rabbitTemplate.setReturnsCallback(new RabbitTemplate.ReturnsCallback() {@Overridepublic void returnedMessage(ReturnedMessage returned) {System.out.printf("消息被退回: %s", returned);}
});return rabbitTemplate;
}@RequestMapping("/msgReturn")
public String msgReturn(){CorrelationData correlationData = new CorrelationData("2");confirmRabbitTemplate.convertAndSend(Constants.CONFIRM_EXCHANGE, 
"confirm11", "message return test...", correlationData);return "消息發送成功";
}
使用RabbitTemplate的setMandatory方法設置消息的mandatory屬性為true(默認為false). 這個屬性 的作用是告訴RabbitMQ, 如果?條消息無法被任何隊列消費, RabbitMQ應該將消息返回給發送者, 此時 ReturnCallback 就會被觸發

回調函數中有一個參數,ReturnMessage,包含以下屬性:

public class ReturnedMessage {//返回的消息對象,包含了消息體和消息屬性private final Message message;//由Broker提供的回復碼, 表?消息?法路由的原因. 通常是?個數字代碼,每個數字代表不同
的含義. private final int replyCode;//?個?本字符串, 提供了?法路由消息的額外信息或錯誤描述.private final String replyText;//消息被發送到的交換機名稱private final String exchange;//消息的路由鍵,即發送消息指定的鍵private final String routingKey;
}

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

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

相關文章

Python的ASGI Web 服務器之uvicorn

文章目錄 什么是uvicornUvicorn 和 uWSGI 對比區別安裝 Uvicorn使用示例 什么是uvicorn 官網https://www.uvicorn.org/ Uvicorn 是一個用于 Python 的 ASGI Web 服務器實現。 Until recently Python has lacked a minimal low-level server/application interface for async…

MongoDB 創建數據庫

MongoDB 創建數據庫 引言 MongoDB 是一款高性能、可擴展的 NoSQL 數據庫,廣泛應用于大數據領域。在 MongoDB 中,創建數據庫是進行數據存儲的第一步。本文將詳細介紹 MongoDB 數據庫的創建方法,包括手動創建和自動創建兩種方式。 MongoDB 數…

并發編程之最小化共享

文章目錄 **什么是「最小化共享」?****為什么要最小化共享?****如何實現最小化共享?****1. 線程局部存儲(Thread-Local Storage)****2. 消息傳遞(Message Passing)****3. 不可變數據&#xff08…

通信之光纖耦合器

以下是關于光纖耦合器的詳細介紹: 定義與原理 - 定義:光纖耦合器是一種能使傳輸中的光信號在特殊結構的耦合區發生耦合,并進行再分配的器件,也叫分歧器、連接器、適配器、光纖法蘭盤。 - 原理:利用不同光纖面緊鄰光纖芯…

自然語言模型的演變與未來趨勢:從規則到多模態智能的跨越

自然語言模型的演變與未來趨勢:從規則到多模態智能的跨越 自然語言處理(NLP)作為人工智能領域最具挑戰性的分支之一,在過去幾十年經歷了翻天覆地的變化。從最初基于規則的系統到如今擁有萬億參數的大型語言模型(LLMs),這一技術革新不僅徹底改…

筆記本電腦更換主板后出現2203:System configuration is invalid,以及2201、2202系統錯誤的解決

筆記本電腦更換主板后啟動出現2203:System configuration is invalid,以及2201、2202系統錯誤的解決 自用的一臺ThinkpadT490筆記本電腦 ,由于主板故障,不得不更換主板,通過某寶購置主板后進行了更換。 具體拆卸筆記本可搜索網絡視頻教程。 注意: 在更換主板時,注意先拍…

JavaScript中的觀察者模式

以下是關于 觀察者模式(Observer Pattern) 的全面梳理,涵蓋核心概念、實現方式、應用場景及注意事項,幫助我們掌握這一解耦事件通知與處理的經典設計模式: 一、觀察者模式基礎 1. 核心概念 定義:定義對象間 一對多 的依賴關系,當被觀察對象(Subject)狀態變化時,自動…

RAG基建之PDF解析的“流水線”魔法之旅

將PDF文件和掃描圖像等非結構化文檔轉換為結構化或半結構化格式是人工智能的關鍵部分。然而,由于PDF的復雜性和PDF解析任務的復雜性,這一過程顯得神秘莫測。 在RAG(Retrieval-Augmented Generation)基建之PDF解析的“魔法”與“陷阱”中,我們介紹了PDF解析的主要任務,對現…

【Linux】GDB調試指南

一、GDB基礎 1. 啟動調試 gdb ./your_program # 啟動調試 gdb --args ./prog arg1 # 帶參數啟動 gdb -p <pid> # 附加到正在運行的進程 2. 斷點管理 b main # 在main函數設斷點 b file.c:20 # 在file.c第20行設斷點 b *0x4005a…

Android面試總結之Glide源碼級理解

當你的圖片列表在低端機上白屏3秒、高端機因內存浪費導致FPS腰斬時&#xff0c;根源往往藏在Glide的內存分配僵化、磁盤混存、網絡加載無優先級三大致命缺陷中。 本文從阿里P8級緩存改造方案出發&#xff0c;結合Glide源碼實現動態內存擴容、磁盤冷熱分區、智能預加載等黑科技&…

驅動開發系列49 - 搭建 Vulkan 驅動調試環境(編譯 mesa 3D)- Ubuntu24.04

一:搭建Vulkan運行環境 安裝vulkan依賴包: 1. sudo apt install vulkan-tools 2. sudo apt install libvulkan-dev 3. sudo apt install vulkan-utility-libraries-dev spirv-tools 4. sudo apt install libglfw3-dev libglm-dev 5. sudo apt install libxxf86vm-dev libxi-…

深度學習——圖像余弦相似度

計算機視覺是研究圖像的學問&#xff0c;在圖像的最終評價時&#xff0c;往往需要用到一些圖像相似度的度量指標&#xff0c;因此&#xff0c;在本文中我們將詳細地介紹原生和調用第三方庫的計算圖像余弦相似度的方法。 使用原生numpy實現 import numpy as npdef image_cosin…

項目代碼第8講【數據庫基礎知識】:SQL(DDL、DML、DQL、DCL);函數(聚合、字符串、數值、日期、流程);約束;多表查詢;事務

黑馬程序員 MySQL數據庫入門到精通&#xff0c;從mysql安裝到mysql高級、mysql優化全囊括_嗶哩嗶哩_bilibili 一、數據庫相關概念 1、主流的關系型數據庫都支持SQL語言——SQL語言可以操作所有的關系型數據庫 像MySQL、Oracle Database、Microsoft SQL Server、IBM Db2等主流的…

如何在阿里云linux主機上部署Node.Js

在阿里云的Linux服務器上搭建Node.js編程環境可以通過以下步驟完成。這里以常見的 Ubuntu/CentOS 系統為例&#xff0c;提供兩種安裝方式&#xff08;包管理器、NVM多版本管理&#xff09;&#xff1a; 一、通過包管理器安裝&#xff08;適合快速安裝指定版本&#xff09; 1. …

Python爬蟲:開啟數據抓取的奇幻之旅(一)

目錄 一、爬蟲初印象&#xff1a;揭開神秘面紗? 二、工欲善其事&#xff1a;前期準備? &#xff08;一&#xff09;Python 環境搭建? 1.下載 Python 安裝包&#xff1a;? 2.運行安裝程序&#xff1a;? 3.配置環境變量&#xff08;若自動添加失敗&#xff09;&#x…

機器學習——集成學習框架(GBDT、XGBoost、LightGBM、CatBoost)、調參方法

一、集成學習框架 對訓練樣本較少的結構化數據領域&#xff0c;Boosting算法仍然是常用項 XGBoost、CatBoost和LightGBM都是以決策樹為基礎的集成學習框架 三個學習框架的發展是&#xff1a;XGBoost是在GBDT的基礎上優化而來&#xff0c;CatBoost和LightGBM是在XGBoost的基礎上…

第十五章:Python的Pandas庫詳解及常見用法

在數據分析領域&#xff0c;Python的Pandas庫是一個不可或缺的工具。它提供了高效的數據結構和數據分析工具&#xff0c;使得數據處理變得簡單而直觀。本文將詳細介紹Pandas庫的基本功能、常見用法&#xff0c;并通過示例代碼演示如何使用Pandas進行數據處理。最后&#xff0c;…

【Python桌面應用】PySide6 界面開發完全指南

文章目錄 1. 引言2. PySide6 簡介與安裝2.1 什么是PySide62.2 PySide6 vs. PyQt62.3 安裝PySide62.4 開發環境配置建議 3. Qt 設計原理3.1 Qt對象模型3.2 信號與槽機制3.3 Qt坐標系統3.4 Qt樣式表(QSS) 4. 創建第一個應用4.1 基本應用結構4.2 主窗口與應用生命周期4.3 使用面向…

用 pytorch 從零開始創建大語言模型(三):編碼注意力機制

從零開始創建大語言模型&#xff08;Python/pytorch &#xff09;&#xff08;三&#xff09;&#xff1a;編碼注意力機制 3 編碼注意力機制3.1 建模長序列的問題3.2 使用注意力機制捕捉數據依賴關系3.3 通過自注意力關注輸入的不同部分3.3.1 一個沒有可訓練權重的簡化自注意力…