《如何在 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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈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方向 ⭐️人生格言:为天地立心,为生民立命,为…