《如何在 Spring 中實現 MQ 消息的自動重連:監聽與發送雙通道策略》

大家好,我是G探險者!

📌 背景場景

在高可用分布式系統中,我們經常面臨:

  • MQ 集群重啟 → 消息監聽中斷
  • MQ 網絡短暫抖動 → 發送端連接失敗
  • 一端恢復正常,另一端仍處于掛死狀態

如果你只配置了“連接工廠層”的重連,卻忽略了監聽容器或發送客戶端的容錯設計,重連機制可能失效,業務陷入長時間不可用。


? 核心理念:監聽和發送是兩個不同的連接“通道”

通道用途組件
監聽通道從 MQ 拉取消息Spring JMS 的?MessageListenerContainer
發送通道發送消息到 MQSpring 的?JmsTemplate

這兩個通道各自有自己的連接池和生命周期,不能指望一個設置就解決全部問題


🔁 一、監聽端的自動重連機制

推薦做法:使用?DefaultMessageListenerContainer?并設置重連間隔

DefaultMessageListenerContainer?container?=?new?DefaultMessageListenerContainer();
container.setConnectionFactory(connectionFactory);
container.setDestinationName("MY.QUEUE");
container.setMessageListener(new?MyListener());// ? 開啟事務模式可選
container.setSessionTransacted(true);// ? 開啟自動重連機制(默認是 true)
container.setRecoveryInterval(5000L);?// 每 5 秒重試連接一次container.afterPropertiesSet();
container.start();

DefaultMessageListenerContainer?內部會捕獲?ConnectionException?等連接中斷異常,自動重試連接。


📤 二、發送端的容災重連策略

監聽容器有容器幫你維護連接,而?發送端(JmsTemplate)則需要連接池支撐

推薦:配合使用?CachingConnectionFactory

ConnectionFactory?factory?=?createIBMConnectionFactory();?// 原始 MQ 工廠
CachingConnectionFactory?cachingFactory?=?new?CachingConnectionFactory(factory);// 可選設置緩存大小(緩存 session 的數量)
cachingFactory.setSessionCacheSize(10);JmsTemplate?jmsTemplate?=?new?JmsTemplate(cachingFactory);
jmsTemplate.convertAndSend("MY.QUEUE",?"Hello MQ");

📌 為啥要用?CachingConnectionFactory

原因描述
重用連接避免每次發送都新建連接(開銷大)
支持連接斷開重建內部封裝連接失效后重建邏輯
提供 session 緩存提升發送效率,降低資源消耗

🧰 三、JMS 廠商參數補充(IBM MQ 舉例)

若你使用 IBM MQ,可以在底層工廠設置:

MQQueueConnectionFactory?factory?=?new?MQQueueConnectionFactory();factory.setHostName("192.168.1.102");
factory.setPort(1414);
factory.setQueueManager("QM1");
factory.setChannel("CHANNEL1");
factory.setTransportType(WMQConstants.WMQ_CM_CLIENT);// ? 啟用自動重連
factory.setIntProperty(WMQConstants.WMQ_CLIENT_RECONNECT_OPTIONS,WMQConstants.WMQ_CLIENT_RECONNECT);// ? 設置最大重連時間(秒)
factory.setIntProperty(WMQConstants.WMQ_CLIENT_RECONNECT_TIMEOUT,?30);// ? 設置連接列表(用于集群 HA)
factory.setStringProperty(WMQConstants.WMQ_CONNECTION_NAME_LIST,"192.168.1.102(1414),192.168.1.103(1414)");

🔗 四、總結策略建議表

場景推薦設置
MQ監聽端DefaultMessageListenerContainer?+?setRecoveryInterval
MQ發送端JmsTemplate?+?CachingConnectionFactory
多 broker/集群設置?CONNECTION_NAME_LIST
事務性保障setSessionTransacted(true)?+?onMessage()?異常觸發 rollback
監聽不生效檢查是否調用了?afterPropertiesSet()

📘 下一篇預告:

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

我們將深入剖析如何使用事務控制 MQ 消息的消費與回滾,Spring 容器如何自動幫你 commit/rollback,以及如何設計冪等保證系統不重復處理失敗消息。


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

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

相關文章

OpenCV 安裝使用教程

一、OpenCV 簡介 OpenCV(Open Source Computer Vision Library)是一個開源計算機視覺和機器學習軟件庫,提供了超過 2500 個優化的算法,用于實時圖像處理、視頻分析、對象識別、人臉檢測、機器學習等任務。 Python 提供了對 Open…

【SNN脈沖神經網絡3】HH神經元軟件仿真

本篇文章主要核心目的在于研究明白HH神經元的數學模型,并且驗證其正確性。因此,在本篇文章中只會使用numpy函數庫用于構建神經元,以及matplotlib用于繪圖。1.導入對應的庫import numpy as np import matplotlib.pyplot as plt import re impo…

「日拱一碼」014 Python常用庫——Pandas

目錄 數據結構 pandas.Series :一維數組,類似于數組,但索引可以是任意類型,而不僅僅是整數 pandas.DataFrame :二維表格型數據結構,類似于 Excel 表格,每列可以是不同的數據類型 數據讀取與寫…

狂命爆肝21天,共51K字的JAVA學習筆記奉上,JAVA從入門到精通一文搞定,一文在手JAVA無憂

背景知識 Java 相關概念 JavaSE (Java Standard Edition): 基礎版,用于開發桌面應用程序。JavaEE (Java Enterprise Edition): 企業版,用于開發企業級應用程序。JavaME (Java Micro Edition): 微型版,用于開發嵌入式系統和移動設備應用程序…

Dijkstra 算法#圖論

Dijkstra 算法 算法前提:在沒有負邊的情況下使用。算法思路:將結點分成已確定最短路長度的點集 S 和未確定最短路長度的點集 T,每次從 T 集合中選取最短路長度最小的結點移到 S 集合中,并對其出邊執行更新操作 從T集合中&#x…

開源與閉源大模型的生態與技術對比:以百度文心4.5開源為視角

技術對比:開源與閉源大模型的優劣勢 性能對比:算力效率與場景適配的博弈 在模型性能的競技場上,開源與閉源大模型呈現出明顯的差異化特征。以百度文心4.5開源系列為例,其47B參數的混合專家(MoE)模型在飛槳…

企業電商解決方案哪家好?ZKmall模塊商城全渠道支持 + 定制化服務更省心

在數字化浪潮席卷各行各業的當下,企業要想拓展市場、提升競爭力,搭建專屬電商平臺已經成了繞不開的選擇。但市場上的電商解決方案五花八門,怎么才能挑到真正適合自己的?其實道理很簡單:能同時搞定全渠道支持和定制化服…

使用哪種語言的人更容易通過面試?

Ruby 和 Swift!似乎語言越大眾面試通過率越低,畢竟崗位數量有限,Java 和 C 程序員所面對的競爭也會更加激烈。使用 Ruby 和 Swift 的程序員比例到底怎么樣?我們可以從 Google Trends 中發現一些蛛絲馬跡。最火熱的 Java 的熱度平均…

Axios 二次封裝高級教程(含請求取消等功能)

Axios 二次封裝高級教程(含請求取消等功能) 整理不易,收藏、點贊、關注哦! 一、總體架構設計 目的:構建一套功能完善、易用且健壯的 HTTP 請求封裝層 核心功能: 請求攔截、響應攔截請求取消(防…

MobileNet V1的Pytorch實現并加載預訓練模型進行驗證

一. 環境 windonws 11RTX5060CUDA 12.8Pytorch 2.9.0dev20250630cu128torchvision 0.23.0dev20250701cu128 二. 代碼 基于Mobilenet-CustomData 的Mobilenet_Pretrain.ipynb 1. 定義Mobile Net V1 import os import time import torch import torch.nn as nn import torch…

HTTP協議利用TCP的特性來實現長連接

在討論網絡協議時,經常會有人提出這樣一個問題:“既然HTTP是基于TCP的,而TCP本身支持長連接,為什么HTTP不支持長連接?”這種說法其實是一種誤解。實際上,HTTP確實可以并且經常使用長連接(也稱為持久連接)。 什么是長連接? 首先,我們需要明確什么是“長連接”。在網…

整流電路Multisim電路仿真實驗匯總——硬件工程師筆記

目錄 1 整流電路基礎 1.1 整流電路基本原理 1.2 整流電路的類型 1.2.1 單相整流電路 1.2.2 三相整流電路 1.3 整流電路的應用 1.3.1 直流電源 1.3.2 電池充電器 1.3.3 變頻調速系統 1.34 電解和電鍍 1.4 整流電路的優缺點 1.4.1 優點 1.4.2 缺點 2 二極管整流電路…

LangChain 全面入門

什么是 LangChain? LangChain 是一個專門為 大語言模型 (LLM) 應用開發設計的開源框架,幫你快速實現: ? 多輪對話 ? 知識庫問答 (RAG) ? 多工具協同調用 (function calling / tool) ? 智能體 Agent 自動決策任務鏈 解耦 LLM 接口、Prom…

RabbitMQ 高級特性之消息確認

1. 簡介 RabbitMQ 的消息發送流程: producer 將消息發送給 broker,consumer 從 broker 中獲取消息并消費 那么在這里就涉及到了兩種消息發送,即 producer 與 broker 之間和 consumer 與 broker 之間。 “消息確認” 討論的是 consumer 與…

【51單片機用數碼管顯示流水燈的種類是按鈕控制數碼管加一和流水燈】2022-6-14

緣由 #include "REG52.h" unsigned char code smgduan[]{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0,64}; //共陰0~F消隱減號 unsigned char Js0, miao0;//中斷計時 秒 分 時 毫秒 sbit k0P3^0; sbit k1P3^1; void smxs(u…

Android15 開機動畫播放結束之后如何直接啟動應用

問題背景 軟件版本:Android15 在一些需求場景里面,需要開機動畫播放結束立馬去啟動一個應用,下面介紹如何實現這種方案。 解決方案 首選我們需要知道開機動畫播放結束之后的流程,這里會調用到wms里面,也就是一些enableScreen之類的函數,知道這個大概流程之后,再去對應…

AI實踐:大模型痛點和解決方案討論

大家好,我是星野,歡迎來到我的CSDN博客。在這個技術日新月異的時代,我們一起學習,共同進步。 今天想和大家分享的是大模型在實際應用中的痛點以及解決方案,特別是RAG(檢索增強生成)技術。 大模…

Web前端工程化

Web前端工程化 前端工程化是指將軟件工程的方法和原則應用到前端開發中,以提高開發效率、保證代碼質量、便于團隊協作和項目維護的一套體系化實踐。以下是前端工程化的主要內容和實踐: 核心組成部分 1. 模塊化開發 JavaScript模塊化:Comm…

Java 原生 HTTP Client

?介紹 Java 原生 HttpClient 是從 Java 11 開始引入的標準庫,用于簡化 HTTP 請求的發送與響應處理。它支持同步和異步請求,并內置對 HTTP/1.1 和 HTTP/2 協議的支持。HttpClient 提供了易用的 API 來設置請求頭、請求體、處理響應以及配置 SSL/TLS 加密…

【C語言刷題】第十天:加量加餐繼續,代碼題訓練,融會貫通IO模式

🔥個人主頁:艾莉絲努力練劍 ?專欄傳送門:《C語言》、《數據結構與算法》、C語言刷題12天IO強訓、LeetCode代碼強化刷題 🍉學習方向:C/C方向 ??人生格言:為天地立心,為生民立命,為…