《JMS事務性會話徹底解析:消息監聽中的 commit、rollback 和冪等設計》

大家好,我是G探險者!

📌 場景引入

在實際項目中,我們常常面臨以下挑戰:

  • 監聽 MQ 消息失敗了,希望自動重試?
  • 消費 MQ 消息后,要寫數據庫,但中間報錯了?
  • 消息處理必須要么成功要么失敗,否則可能導致臟數據?
  • 消息是冪等的嗎?可以重復投遞處理嗎?

這些都需要?事務性會話 + 容器回滾機制 + 冪等控制?組合拳來解決。


? 一、什么是 JMS 的事務性會話?

事務性會話(transacted = true)是一種?將消息的接收與處理放入事務中控制?的機制。

與確認模式(acknowledge)對比:

特性確認模式(ACK)事務性會話(Transacted)
消息確認AUTO_ACKNOWLEDGECLIENT_ACKNOWLEDGE?等使用?session.commit()
回滾方式手動控制 ACK拋異常或手動?session.rollback()
MQ是否重發消息否(默認不重發)? 是,失敗自動重新投遞
一次事務包含消息數一條(Spring容器下)? 默認一條,支持手動多條

🛠? 二、Spring 如何開啟事務性監聽?

Spring 中的?DefaultMessageListenerContainer?支持事務模式:

DefaultMessageListenerContainer?container?=?new?DefaultMessageListenerContainer();
container.setConnectionFactory(connectionFactory);
container.setDestinationName("MY.QUEUE");
container.setMessageListener(new?MyListener());container.setSessionTransacted(true);?// ? 開啟事務會話
container.setSessionAcknowledgeMode(Session.SESSION_TRANSACTED);?// 推薦container.afterPropertiesSet();
container.start();

這樣配置后,每條消息的處理會包裹在如下事務中:

Session session = connection.createSession(true, Session.SESSION_TRANSACTED)

🧪 三、事務處理機制詳解

Spring 容器負責自動控制事務行為:

try?{messageListener.onMessage(message);session.commit();?// ? 成功后提交
}?catch?(Throwable ex) {session.rollback();?// ? 拋異常后回滾,MQ 重發消息throw?ex;
}

? 你只要記住:

  • 成功就正常返回(容器幫你 commit)
  • 失敗就拋出異常(容器自動 rollback)

🔂 四、消息重試機制聯動

Spring rollback → MQ 檢測未 commit → 觸發重投

🔁 每個 MQ 中間件(IBM MQ、ActiveMQ、TongLinkQ 等)都支持配置:

  • 最大重投次數
  • 重投間隔(redelivery delay)
  • 超過重試后投遞到死信隊列(DLQ)

💥 五、事務作用范圍:是“一條消息”嗎?

這個問題很關鍵,我們以 Spring 默認配置為例說明:

場景事務作用范圍
DefaultMessageListenerContainer?默認行為? 每條消息單獨包裹事務
自定義?Session?拉多條消息后統一 commit? 多條消息為一個事務
設置并發消費者(線程池)每條消息獨立事務(線程隔離)

實戰建議:

? 在監聽容器中消費 MQ 消息,默認一條消息就是一個事務單元,安全可靠。


🎯 六、事務 + 冪等的設計建議

事務只能解決“要么成功、要么失敗”的問題,不能避免重復處理

所以業務系統通常要配合冪等性策略:

場景冪等性設計建議
寫數據庫利用主鍵/唯一索引避免重復插入
寫 Redis使用?SETNX?保證消息只處理一次
寫業務日志使用消息 ID 做去重處理
第三方調用如果不能重復調用,要做冪等屏障

?? 七、監聽失敗常見問題排查

問題排查建議
沒開啟事務?是否調用了?setSessionTransacted(true)
容器未啟動?是否漏了?afterPropertiesSet()?調用
消息處理失敗后 MQ 不重發?是否吞掉異常了?應拋出異常給容器
重投失敗消息去哪了?查看 MQ 的 DLQ(死信隊列)配置

📘 小結

功能點建議配置
自動控制 commit/rollback使用?DefaultMessageListenerContainer
每條消息開啟事務setSessionTransacted(true)
拋異常觸發回滾在?onMessage()?中不要吞異常
冪等設計配合事務做冪等邏輯
消息處理失敗自動重試借助 MQ 的重投策略 + Spring 回滾機制

📘 下一篇預告:

第 4 篇:《JMS 消息重試機制與死信隊列配置指南》
我們將詳細講解 MQ 的 redelivery policy、最大重試次數配置、死信隊列處理策略,以及如何在 Spring 中優雅應對消費失敗。


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

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

相關文章

vue3 el-table 列增加 自定義排序邏輯

在 Vue 3 中使用 Element Plus 的 <el-table> 組件時&#xff0c;如果你想增加自定義排序邏輯&#xff0c;可以通過以下幾個步驟實現&#xff1a; 1. 使用 default-sort 屬性 首先&#xff0c;你可以在 <el-table> 組件上使用 default-sort 屬性來指定默認的排序…

ISP Pipeline(7): Gamma Correction 伽馬校正

AI_Plays/ISP/Fast_ISP_Progress.ipynb at main ameengee/AI_Plays GitHub Gamma Correction&#xff08;伽馬校正&#xff09;是圖像處理中的一個重要步驟&#xff0c;目的是調整圖像的亮度&#xff0c;使其更符合人眼的感知或顯示設備的特性。 為什么需要 Gamma Correcti…

AI提取伴奏,實現卡拉OK效果 —— 「suno api/luno api/kuka api」

導讀 喜歡唱歌&#xff0c;卻總苦于找不到純凈的伴奏&#xff1f;或者你想把喜歡的歌曲翻唱一遍&#xff0c;卻被人聲干擾搞得頭大&#xff1f;現在&#xff0c;AI技術已經悄悄解決了這個問題。借助AI智能工具&#xff0c;你可以輕松提取任何一首歌的伴奏&#xff0c;享受宛如…

pip介紹

pip是什么&#xff1f; pip&#xff08;Pip Installs Packages&#xff09;是Python的官方管理工具&#xff0c;用于安裝、升級、卸載和管理Python第三方庫及其依賴關系。它是Python生態系統的核心組件&#xff0c;通過連接PyPI&#xff08;Python Package Index&#xff09;這…

機器學習20-線性網絡思考

機器學習20-線性網絡思考 針對線性網絡的基礎問題&#xff0c;使用基礎示例進行解釋 1-核心知識點 1-線性模型家族的線性回歸和邏輯回歸分別是什么&#xff0c;線性模型家族還有沒有其他的模型 線性模型家族是一系列基于線性假設的統計模型&#xff0c;它們假設因變量和自變量…

【科研繪圖系列】R語言繪制世界地圖分布(world map)

禁止商業或二改轉載,僅供自學使用,侵權必究,如需截取部分內容請后臺聯系作者! 文章目錄 介紹加載R包數據下載導入數據數據預處理準備畫圖畫圖總結系統信息介紹 本教程旨在通過R語言及其相關地理空間分析包,展示如何對環境數據進行空間聚類分析,并將結果可視化。教程從讀…

Armbian 25.5.1 Noble Gnome 開啟遠程桌面功能

sudo apt install gnome-remote-desktop ----長話短說 故障表現 Ubuntu 25版本點擊遠程桌面功能沒有任何反應, WIN_20250630_00_53_24_Pro 最后 armbian 官方社區充滿了傲慢,一言不合就關閉話題,問題都沒有解決就給我關閉了 最后檢索到英文網站,說到了這么一句話,檢查遠程桌…

嵌入式 Linux 入門:從裸機到系統級開發的第一步

隨著嵌入式系統應用的不斷深入&#xff0c;很多 MCU 項目開發者會在某個階段遇到瓶頸&#xff1a;系統越來越復雜、任務越來越多、通信越來越頻繁、性能要求越來越高。 這時候&#xff0c;從 MCU / RTOS 過渡到 嵌入式 Linux 開發 就成為一次技術升級的關鍵轉折點。 本文將帶…

詳解 Blazor 組件傳值

父子組件傳值 在 Blazor 中&#xff0c;組件之間的通信可以通過 [Parameter] 參數和 EventCallback<T> 事件回調實現。下面分別給出 父組件傳遞值給子組件 和 子組件傳遞值給父組件 的簡單示例。 1.1 父組件傳遞值給子組件 步驟&#xff1a; 在子組件中定義 public 屬…

力扣熱題100再刷

160.相交鏈表 讀一遍A&#xff0c;一個set存節點&#xff0c;遍歷B的時候判斷即可。復習下set的STL&#xff1a;set有set和unordered_set&#xff0c;同樣有insert&#xff0c;find&#xff0c;count&#xff0c;對于set而言&#xff0c;自動從小到大排序&#xff0c;還有&…

MySQL常用函數性能優化及索引影響分析

MySQL 常用函數性能優化指南&#xff08;含索引影響分析&#xff09; 以下是 MySQL 函數使用指南&#xff0c;新增性能影響評級、索引失效分析和優化方案&#xff0c;幫助您高效使用函數&#xff1a; &#x1f4dc; 一、字符串處理函數&#xff08;含性能分析&#xff09; 函…

莫隊(基礎版)優雅的暴力

莫隊算法是一種離線算法&#xff0c;常用于高效處理區間查詢問題。它通過合理排序和移動左右端點來減少時間復雜度。 基本思想 莫隊算法的核心思想是將所有查詢離線排序&#xff01;&#xff01;&#xff08;找出一個過起來最快的查詢順序&#xff09;&#xff0c;然后通過移動…

? Python 高級定制 | 美化 Word 表格邊框與樣式(收貨記錄增強版)

之前我們完成了 Excel 數據提取、Word 表格寫入與合并&#xff0c;現在繼續 為 Word 表格添加高級樣式 裝扮&#xff0c;包括單元格邊框、背景填色、居中對齊、粗體、高亮行/列等&#xff0c;進一步增強表格的可讀性與專業性。 &#x1f58c;? 樣式設置函數 1. 設置單元格邊框…

Clickhouse源碼分析-TTL執行流程

第一種情況&#xff1a;無ttl_only_drop_parts配置 總體示例以及說明 如果沒有ttl_only_drop_parts的配置&#xff0c;過期數據的刪除&#xff08;這里是刪除&#xff0c;是將過期的數據從這個part刪除&#xff0c;并將過期的數據構成一個part&#xff0c;這個過期的part標記…

elementui修改radio字體的顏色和圓圈的樣式

改完 <div class"choose"><el-radio-group v-model"radioNum"><el-radio label"1" size"large">Option 1</el-radio><el-radio label"2" size"large">Option 2</el-radio>&l…

力扣3381. 長度可被 K 整除的子數組的最大元素和

由于數據范圍是2*10^5所以必然是遍歷一次&#xff0c;子數組必定要用到前綴和&#xff0c;之前的題目中總是遇到的是子數組的和能不能被k整除&#xff0c;而這里不一樣的是子數組的長度能不能被k整除&#xff0c;如果單純的枚舉長度必定超時&#xff0c;而看看題解得出的思路&a…

基于SSM的勤工助學系統的設計與實現

第1章 摘要 基于SSM框架的勤工助學系統旨在為學生、用工部門和管理員提供高效便捷的管理平臺。系統包括學生端、用工部門端和管理員端&#xff0c;涵蓋了從崗位發布、申請審核、工時記錄、薪資管理到數據統計等完整的功能需求。 學生可以通過系統首頁瀏覽最新的崗位信息和公告&…

2025年06月30日Github流行趨勢

項目名稱&#xff1a;twenty 項目地址 URL&#xff1a;https://github.com/twentyhq/twenty項目語言&#xff1a;TypeScript歷史 star 數&#xff1a;31,774今日 star 數&#xff1a;1,002項目維護者&#xff1a;charlesBochet, lucasbordeau, FelixMalfait, Weiko, bosiraphae…

creo 2.0學習筆記

Creo軟件從入門到精通——杜書森 1.1 Creo基本建模過程介紹 新建-零件-改名稱-取消使用默認模板&#xff0c;是因為默認的是英制尺寸&#xff0c;自定義可選擇mmns_part_solid&#xff0c;模板主要是設置模型的單位拉伸-選取FRONT-點擊草繪視圖&#xff0c;可進行草繪旋轉——…

ZNS初步認識—GPT

1. ZNS SSD 的基本概念 Zoned Namespace (ZNS): ZNS 是一種新的NVMe接口規范&#xff0c;它將SSD的邏輯塊地址空間劃分為多個獨立的、固定大小的“區域”&#xff08;Zones&#xff09;。區域 (Zone): ZNS SSD 的基本管理單元。每個區域都有自己的寫入指針&#xff08;write p…