【RabbitMQ的重試配置retry】重試配置不生效原因

在Spring Boot項目中,RabbitMQ的retry重試配置不生效可能由以下原因導致:

核心問題定位

retry:enabled: true  # ? 配置已開啟max-attempts: 3 # ? 參數有效

但實際未觸發重試,可能原因如下:


1. 容器類型不匹配

癥狀表現

配置參數雖然正確,但應用在SimpleMessageListenerContainer(對應配置路徑spring.rabbitmq.listener.simple)時,若實際使用的是DirectMessageListenerContainer(對應路徑spring.rabbitmq.listener.direct),配置將不生效

驗證方式

檢查應用日志啟動時的容器初始化信息:

2023-07-20 14:30:01 [main] INFO  o.s.a.r.l.SimpleMessageListenerContainer - Container initialized for queues: [jpaas.itinerary.audit.queue]

2. 手動ACK模式下異常未被傳播

關鍵代碼邏輯

當使用手動確認模式時,必須確保異常能傳遞到容器層面:

public void itineraryAudit(String message, Channel channel, @Header(AmqpHeaders.DELIVERY_TAG) long tag) {try {// 業務處理processMessage(message);channel.basicAck(tag, false); // ? 正常確認} catch (Exception e) {// ? 錯誤示例:捕獲異常但未拋出log.error("處理失敗", e);// 必須拋出異常才能觸發重試throw new AmqpRejectAndDontRequeueException(e); }
}
錯誤模式示例
try {// ...
} catch (Exception e) {channel.basicReject(tag, false); // ? 直接拒絕消息,繞過重試機制
}

3. 自定義RetryTemplate覆蓋配置

配置沖突場景

若代碼中通過@Bean自定義了RetryTemplate:

@Bean
public RetryTemplate myRetryTemplate() {return new RetryTemplate(); // ? 覆蓋了yaml中的配置參數
}

將導致application.yml中的配置失效


4. 異常類型不可重試

重試策略規則

Spring Retry默認僅對以下異常進行重試:

retryPolicy.setRetryableThrowableTypes(Collections.singletonMap(RuntimeException.class, true));

若業務代碼拋出IOException等checked異常,默認不會被重試

解決方案

在配置中顯式指定可重試異常:

retry:retryable-exceptions: java.io.IOException: true

5. 死信隊列配置干擾

特殊場景

當同時配置了死信隊列(DLX)時,若出現以下配置:

@Queue(value = "audit.queue", arguments = {@Argument(name = "x-dead-letter-exchange", value = "dlx.exchange"),@Argument(name = "x-dead-letter-routing-key", value = "dlx.key")
})

當消息被拒絕時可能直接進入死信隊列,而不會觸發重試


排查工具包

步驟1:啟用DEBUG日志
logging:level:org.springframework.retry: DEBUGorg.springframework.amqp.rabbit.retry: TRACE
步驟2:觀察重試日志
2023-07-20 15:00:00 DEBUG o.s.retry.support.RetryTemplate - Retry: count=0
2023-07-20 15:00:02 DEBUG o.s.retry.support.RetryTemplate - Checking for rethrow: count=1
步驟3:驗證容器配置
@Autowired
private RabbitListenerEndpointRegistry registry;public void checkContainerType() {registry.getListenerContainers().forEach(container -> {System.out.println("Container class: " + container.getClass().getName());});
}

最佳實踐示例

spring:rabbitmq:listener:type: simple # 強制使用simple容器simple:retry:enabled: truemax-attempts: 3max-interval: 10000initial-interval: 2000multiplier: 2retryable-exceptions: java.lang.Exception: true # 允許所有異常重試

通過上述排查和調整,可確保RabbitMQ消息消費的重試機制按預期工作。

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

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

相關文章

如何在WPS和Word/Excel中直接使用DeepSeek功能

以下是將DeepSeek功能集成到WPS中的詳細步驟,無需本地部署模型,直接通過官網連接使用:1. 下載并安裝OfficeAI插件 (1)訪問OfficeAI插件下載地址:OfficeAI助手 - 免費辦公智能AI助手, AI寫作,下載…

程序詩篇里的靈動筆觸:指針繪就數據的夢幻藍圖<7>

大家好啊,我是小象?(?ω?)? 我的博客:Xiao Xiangζ????? 很高興見到大家,希望能夠和大家一起交流學習,共同進步。 今天我們一起來學習轉移表,回調函數,qsort… 目錄 一、轉移表1.1 定義與原理1.3…

使用Jenkins實現鴻蒙HAR應用的自動化構建打包

使用Jenkins實現鴻蒙HAR應用的自動化構建打包 在軟件開發領域,自動化構建是提高開發效率和確保代碼質量的重要手段。特別是在鴻蒙(OpenHarmony)應用開發中,自動化構建更是不可或缺。本文將詳細介紹如何使用Jenkins命令行工具實現…

漏洞分析 Spring Framework路徑遍歷漏洞(CVE-2024-38816)

漏洞概述 VMware Spring Framework是美國威睿(VMware)公司的一套開源的Java、JavaEE應用程序框架。該框架可幫助開發人員構建高質量的應用。 近期,監測到Spring Framework在特定條件下,存在目錄遍歷漏洞(網宿評分&am…

筆記:理解借貸相等的公式

強烈推薦非會計人士,快速了解會計看這個系列的視頻,其中比較燒腦的“借貸相等”公式,這個視頻講解的不錯: 4.小白財務入門-借貸記賬法_嗶哩嗶哩_bilibili 比如這里,錢在銀行卡重,所以銀行存款就是借方…

Java算法技術文章:深入解析排序、搜索與數據結構

引言 在軟件開發的世界里,算法不僅是程序設計的基礎,更是提升軟件性能、優化用戶體驗的關鍵。Java,作為一種廣泛使用的編程語言,提供了豐富的API和標準庫來支持各種算法的實現。本文將深入探討Java中的排序算法、搜索算法以及一些…

Android15音頻進階之MediaRecorder支持通道(一百零五)

簡介: CSDN博客專家、《Android系統多媒體進階實戰》一書作者 新書發布:《Android系統多媒體進階實戰》?? 優質專欄: Audio工程師進階系列【原創干貨持續更新中……】?? 優質專欄: 多媒體系統工程師系列【原創干貨持續更新中……】?? 優質視頻課程:AAOS車載系統+…

個人 Vite 構建性能分析插件開發實踐

Vite 構建分析插件開發實踐 一、開發背景 在個人項目開發中遇到以下問題: 🕒 構建時間波動大(30%)🔍 難以定位耗時模塊📈 缺乏構建進度反饋 開發目標: 實現模塊級耗時分析提供實時進度預測識…

【Spring】什么是Spring?

什么是Spring? Spring是一個開源的輕量級框架,是為了簡化企業級開發而設計的。我們通常講的Spring一般指的是Spring Framework。Spring的核心是控制反轉(IoC-Inversion of Control)和面向切面編程(AOP-Aspect-Oriented Programming)。這些功能使得開發者…

學習筆記:機器學習中的數學原理(一)

1. 集合 集合分為有限集和無限集; 對于有限集,兩集合元素數相等即為等勢; 對于無限集,兩集合元素存在一一映射關系即為等勢; 無限集根據是否與正整數集等勢分為可數集和不可數集。 2. sigmoid函數(也叫…

【信息系統項目管理師-案例真題】2016下半年案例分析答案和詳解

更多內容請見: 備考信息系統項目管理師-專欄介紹和目錄 文章目錄 試題一【問題1】4 分【問題2】12 分【問題3】3 分【問題4】6 分試題二【問題1】3 分【問題2】4 分【問題3】8 分【問題4】5 分【問題5】5 分試題三【問題1】4 分【問題2】8 分【問題3】5 分【問題4】8 分試題一…

基于javaweb的SpringBoothis智能醫院管理系統(源碼+文檔+部署講解)

🎬 秋野醬:《個人主頁》 🔥 個人專欄:《Java專欄》《Python專欄》 ??心若有所向往,何懼道阻且長 文章目錄 運行環境開發工具適用功能說明一、項目運行 環境配置: 運行環境 Java≥8、MySQL≥5.7、Node.js≥14 開發工具 后端&…

JS實現燈光閃爍效果

在 JS中&#xff0c;我們可以實現燈光閃爍效果&#xff0c;這里主要用 setInterval 和 clearInterval 兩個重要方法。 效果圖 源代碼 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>燈閃爍效果<…

Linux ltrace跟蹤入門

文章目錄 背景ltrace原理ltrace使用跟蹤程序調用庫函數跟蹤指定pid進程調用 參考 本文介紹ltrace跟蹤 背景 ltrace 會攔截并記錄正在執行的進程所調用的動態庫調用以及該進程接收到的信號&#xff0c;它還可以攔截并打印程序執行的系統調用。 其代碼位置在&#xff1a;https:/…

PCA9685 16路PWM 控制板 STM32F103 驅動

PCA9685 擁有16路PWM&#xff0c;通過 IIC 與 STM32 進行通信&#xff0c;以下驅動代碼已通過測試&#xff0c;你可以進行更多代碼優化 #include "pca9685.h"// 向 PCA9685 寫入一個字節數據 static void PCA9685_write8( uint8_t addr, uint8_t d) {while (I2C_Get…

使用 Apache Spark 進行大數據分析

使用 Apache Spark 進行大數據分析 環境準備 為了能夠在本地環境中運行Spark程序&#xff0c;需要先完成環境搭建。確保已經安裝了Jupyter Notebook和Apache Spark&#xff0c;并完成了兩者之間的集成。 創建 SparkSession 在 Python 中使用 PySpark 時&#xff0c;通常會創…

2025 專業的物聯網軟件開發公司有哪些

物聯網&#xff08;Internet of Things&#xff0c;簡稱IoT&#xff09;具有多個顯著的優勢&#xff0c;主要包括提高效率、節省成本、數據收集與分析、自動化控制、改善用戶體驗、增強決策能力和創新業務模式?。2025&#xff0c;有哪些比較專業的物聯網開發公司呢&#xff1f…

7.PPT:“中國夢”學習實踐活動【20】

目錄 NO1234? NO5678? NO9\10\11 NO1234 考生文件夾下創建一個名為“PPT.pptx”的新演示文稿Word素材文檔的文字&#xff1a;復制/挪動→“PPT.pptx”的新演示文稿&#xff08;藍色、黑色、紅色&#xff09; 視圖→幻燈片母版→重命名&#xff1a;“中國夢母版1”→背景樣…

學習筆記十九:K8S生成pod過程

K8S生成pod過程 流程圖具體生成過程用戶提交 Pod 定義API Server 處理請求調度器分配節點&#xff08;Scheduling&#xff09;目標節點上的 Pod 創建網絡配置狀態上報與監控控制器管理&#xff08;Controller Manager&#xff09;就緒與服務發現 關鍵錯誤場景高級特性 流程圖 具…

封裝descriptions組件,描述,靈活

效果 1、組件1&#xff0c;dade-descriptions.vue <template><table><tbody><slot></slot></tbody> </table> </template><script> </script><style scoped>table {width: 100%;border-collapse: coll…