rabbitmq學習筆記 ----- 多級消息延遲始終為 20s 問題排查

問題現象

在實現多級延遲消息功能時,發現每次消息延遲間隔始終為20s,無法按照預期依次使用20s→10s→5s的延遲時間。日志顯示每次處理時移除的延遲時間都是20000L。

問題代碼片段

1.生產者

@Testvoid sendDelayMessage2() {List<Long> expireTimeList = new ArrayList<>();{expireTimeList.add(20000L);expireTimeList.add(10000L);expireTimeList.add(5000L);}delayMessage<String> msg = new delayMessage<>("hello,world222!", expireTimeList);rabbitTemplate.convertAndSend("delay.exchange", "hi",msg, message -> {message.getMessageProperties().setDelay(msg.removeDelayTime().intValue());return message;});}

2.消費者

    @RabbitListener(bindings = @QueueBinding(value = @Queue(value = "delay.queue", durable = "true"),exchange = @Exchange(value = "delay.exchange", delayed = "true"),key = "hi"))public void listenMultiDelay(delayMessage<String> msg) {log.info("收到消息: {}" , msg.getMessage());if(msg.hasExpireTime()){log.info("消息還有延遲時間,繼續投遞,剩余延遲時間:" );rabbitTemplate.convertAndSend("delay.exchange", "hi",msg, message -> {message.getMessageProperties().setDelay(msg.removeDelayTime().intValue());return message;});}}

3.延遲消息類

@Data
public class delayMessage<T> {private T message;private List<Long> expireTime;public delayMessage() {}public delayMessage(T message, List<Long> expireTime) {this.message = message;this.expireTime = expireTime;}public Long removeDelayTime(){System.out.println("removeDelayTime: "+expireTime.get(0));return expireTime.remove(0);}public boolean hasExpireTime(){return !expireTime.isEmpty();}}

4.啟動配置

    @Beanpublic MessageConverter messageConverter() {return new Jackson2JsonMessageConverter();}

核心原因分析

問題根源Jackson2JsonMessageConverter的序列化特性與業務邏輯設計之間的沖突有關:

  • Jackson2JsonMessageConverter工作機制

    • 發送消息時,將對象序列化為JSON字符串(數據快照)
    • 接收消息時,將JSON字符串重新反序列化為全新的對象實例,而非復用原對象
  • 對delayMessage對象的影響

    • 發送端調用removeDelayTime()后,內存中對象的expireTime列表已變為[10000L, 5000L]
    • 但序列化保存的是操作前的狀態快照(包含20000L的完整列表)
    • 消費者接收時,反序列化創建的是新對象,expireTime列表恢復為初始狀態[20000L, 10000L, 5000L]
    • 導致每次處理都從20000L開始,形成無限循環
  • 總結:說人話就是 Jackson2JsonMessageConverter 將消息轉換成json格式前,delayMessage中的expireTime還沒有收到removeDelayTime()的影響而改變

解決方案: 先改對象,再序列化

修正后代碼:生產者(消費者同理)

    @Testvoid sendDelayMessage2() {List<Long> expireTimeList = new ArrayList<>();{expireTimeList.add(20000L);expireTimeList.add(10000L);expireTimeList.add(5000L);}delayMessage<String> msg = new delayMessage<>("hello,world222!",expireTimeList);// 先進行延遲時間的更新Long delaytime = msg.removeDelayTime();rabbitTemplate.convertAndSend("delay.exchange", "hi",msg, message -> {message.getMessageProperties().setDelay(delaytime.intValue());return message;});}

通過以上調整,多級延遲消息可按預期依次使用20s→10s→5s的延遲時間,最終解決了始終20s延遲的問題。

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

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

相關文章

軟件測試(三):測試流程及測試用例

1.測試流程1.需求分析進行測試之前先閱讀需求文檔&#xff0c;分析指出不合理或不明確的地方2.計劃編寫與測試用例測試用例用例即&#xff1a;用戶使用的案例測試用例&#xff1a;執行測試的文檔作用&#xff1a;用例格式&#xff1a;----------------------------------------…

Python:列表的進階技巧

列表&#xff08;list&#xff09;作為 Python 最常用的數據結構之一&#xff0c;不僅能存儲有序數據&#xff0c;還能在推導式、函數參數傳遞、數據處理等場景中發揮強大作用。下面介紹一些進階技巧與常見應用。一、去重與排序1、快速去重&#xff08;不保序&#xff09;nums …

【完整源碼+數據集+部署教程】硬幣分類與識別系統源碼和數據集:改進yolo11-SWC

背景意義 隨著經濟的發展和數字支付的普及&#xff0c;傳統硬幣的使用逐漸減少&#xff0c;但在某些地區和特定場合&#xff0c;硬幣仍然是重要的支付手段。因此&#xff0c;硬幣的分類與識別在自動化支付、智能零售和物聯網等領域具有重要的應用價值。尤其是在銀行、商超和自助…

萊特萊德:以“第四代極限分離技術”,賦能生物發酵產業升級

萊特萊德&#xff1a;以“第四代極限分離技術”&#xff0c;賦能生物發酵產業升級Empowering Upgrades in the Bio-Fermentation Industry with "Fourth-Generation Extreme Separation Technology生物發酵行業正經歷從 “規模擴張” 向 “質效提升” 的關鍵轉型&#xff…

外賣大戰之后,再看美團的護城河

美團&#xff08;03690.HK&#xff09;于近日發布了2025年Q2財報&#xff0c;市場無疑將更多目光投向了其備受關注的外賣業務上。毫無懸念&#xff0c;受外賣競爭和加大投入的成本影響&#xff0c;美團在外賣業務上的財務數據受到明顯壓力&#xff0c;利潤大幅下跌&#xff0c;…

R包fastWGCNA - 快速執行WGCNA分析和下游分析可視化

最新版本: 1.0.0可以對著視頻教程學習和使用&#xff1a;然而還沒錄呢, 關注B站等我更新R包介紹 開發背景 WGCNA是轉錄組或芯片表達譜數據常用得分析, 可用來鑒定跟分組或表型相關得模塊基因和核心基因但其步驟非常之多, 每次運行起來很是費勁, 但需要修改的參數并不多所以完全…

GitHub 熱榜項目 - 日榜(2025-08-29)

GitHub 熱榜項目 - 日榜(2025-08-29) 生成于&#xff1a;2025-08-29 統計摘要 共發現熱門項目&#xff1a;11 個 榜單類型&#xff1a;日榜 本期熱點趨勢總結 本期GitHub熱榜展現出三大技術趨勢&#xff1a;1&#xff09;AI應用持續深化&#xff0c;ChatGPT等大模型系統提示…

【深度學習實戰(58)】bash方式啟動模型訓練

export \PATHPYTHONPATH/workspace/mmlab/mmdetection/:/workspace/mmlab/mmsegmentation/:/workspace/mmlab/mmdeploy/:${env:PYTHONPATH} \CUDA_VISIBLE_DEVICES0 \DATA_ROOT_1/mnt/data/…/ \DATA_ROOT_2/mnt/data/…/ \DATA_ROOT_MASK/…/ \PATH_COMMON_PACKAGES_SO…sonoh…

【物聯網】關于 GATT (Generic Attribute Profile)基本概念與三種操作(Read / Write / Notify)的理解

“BLE 讀寫”在這里具體指什么&#xff1f; 在你的系統里&#xff0c;樹莓派是 BLE Central&#xff0c;Arduino 是 BLE Peripheral。 Central 和 Peripheral 通過 **GATT 特征&#xff08;Characteristic&#xff09;**交互&#xff1a;讀&#xff08;Read&#xff09;&#x…

JavaSE丨集合框架入門(二):從 0 掌握 Set 集合

這節我們接著學習 Set 集合。一、Set 集合1.1 Set 概述java.util.Set 接口繼承了 Collection 接口&#xff0c;是常用的一種集合類型。 相對于之前學習的List集合&#xff0c;Set集合特點如下&#xff1a;除了具有 Collection 集合的特點&#xff0c;還具有自己的一些特點&…

金屬結構疲勞壽命預測與健康監測技術—— 融合能量法、紅外熱像技術與深度學習的前沿實踐

理論基礎與核心方法 疲勞經典理論及其瓶頸 1.1.疲勞失效的微觀與宏觀機理&#xff1a; 裂紋萌生、擴展與斷裂的物理過程。 1.2.傳統方法的回顧與評析。 1.3.引出核心問題&#xff1a;是否存在一個更具物理意義、能統一描述疲勞全過程&#xff08;萌生與擴展&#xff09;且試驗量…

【貪心算法】day4

&#x1f4dd;前言說明&#xff1a; 本專欄主要記錄本人的貪心算法學習以及LeetCode刷題記錄&#xff0c;按專題劃分每題主要記錄&#xff1a;&#xff08;1&#xff09;本人解法 本人屎山代碼&#xff1b;&#xff08;2&#xff09;優質解法 優質代碼&#xff1b;&#xff…

AI 與腦機接口的交叉融合:當機器 “讀懂” 大腦信號,醫療將迎來哪些變革?

一、引言&#xff08;一&#xff09;AI 與腦機接口技術的發展現狀AI 的崛起與廣泛應用&#xff1a;近年來&#xff0c;人工智能&#xff08;AI&#xff09;技術迅猛發展&#xff0c;已廣泛滲透至各個領域。從圖像識別、自然語言處理到智能決策系統&#xff0c;AI 展現出強大的數…

uniapp vue3 canvas實現手寫簽名

userSign.vue <template><view class"signature"><view class"btn-box" v-if"orientation abeam"><button click"clearClick">重簽</button><button click"finish">完成簽名</butt…

頁面跳轉html

實現流程結構搭建&#xff08;HTML&#xff09;創建側邊欄容器&#xff0c;通過列表或 div 元素定義導航項&#xff0c;每個項包含圖標&#xff08;可使用字體圖標庫如 Font Awesome&#xff09;和文字&#xff0c;為后續點擊交互預留事件觸發點。樣式設計&#xff08;CSS&…

Spring Boot自動裝配機制的原理

文章目錄一、自動裝配的核心觸發點&#xff1a;SpringBootApplication二、EnableAutoConfiguration的作用&#xff1a;導入自動配置類三、自動配置類的加載&#xff1a;SpringFactoriesLoader四、自動配置類的條件篩選&#xff1a;Conditional注解五、自動配置的完整流程六、自…

(未完結)階段小總結(一)——大數據與Java

jdk8-21特性核心特征&#xff1a;&#xff08;8&#xff09;lambda&#xff0c;stream api&#xff0c;optional&#xff0c;方法引用&#xff0c;函數接口&#xff0c;默認方法&#xff0c;新時間Api&#xff0c;函數式接口&#xff0c;并行流&#xff0c;ComletableFuture。&…

嵌入式Linux驅動開發:設備樹與平臺設備驅動

嵌入式Linux驅動開發&#xff1a;設備樹與平臺設備驅動 引言 本筆記旨在詳細記錄嵌入式Linux驅動開發中設備樹&#xff08;Device Tree&#xff09;和平臺設備驅動&#xff08;Platform Driver&#xff09;的核心概念與實現。通過分析提供的代碼與設備樹文件&#xff0c;我們…

【完整源碼+數據集+部署教程】骨折檢測系統源碼和數據集:改進yolo11-EfficientHead

背景意義 骨折作為一種常見的骨骼損傷&#xff0c;其診斷和治療對患者的康復至關重要。傳統的骨折檢測方法主要依賴于醫生的經驗和影像學檢查&#xff0c;如X光、CT等&#xff0c;這不僅耗時&#xff0c;而且容易受到主觀因素的影響。隨著計算機視覺和深度學習技術的迅猛發展&a…

面試記錄7 c++軟件開發工程師

開目 一面&#xff1a; 自我介紹你做的xxx應用是用c做的嗎&#xff0c;是在window平臺嗎具體做的事情是什么你說的2D3D的結構是什么樣的&#xff0c;怎樣去做校驗有沒有二維到三維或者三維到二維的數據轉換兩個向量怎么去做校驗做的什么優化有調用第三方庫嗎是用的什么工具&…