优雅的解决SpringBoot集成RabbitMQ序列化和反序列化的思路2

优雅的解决SpringBoot集成RabbitMQ序列化和反序列化的思路1 文章目录序原由思路 序 最近又充满的冲劲,打算再把博客捡起来,(っ•̀ω•́)っ✎⁾⁾ 我爱学习 原由 Spring-AMQP 支持 生产者 使用自定义的 Bean,然后通过 MessageConverter 转换成Message 进行发送。消费者 也可以通过 MessageConverter 将 Message再转化成自定义类。毕竟 Message 构建解析还是挺麻烦的。 MessageConverter有多个子类: 通过 Java Serializable,String,纯byte[] 进行传递 :S 阅读详情

序

我是最棒的,加油,博客不能停,要不断的吸收消化然后再输出。

思路

咱们本文先解决上文的问题1, 为了满足 开闭原则(OCP),对扩展开放,对修改关闭,这样可以减少维护带来的风险。咱们就要 动态加载、自动加载 Class和 __TypeId__ 的映射关系,而不是在配置类中手动维护。
那怎么样动态加载呢?这毕竟是个 SpringBoot 项目,在日常开发潜移默化中,咱们应该很快就会想到 注解扫描 。 Spring 就是通过 注解扫描,来生成 BeanName 跟对应实例的映射关系,通过这种方式取缔 Xml 的配置方式,方便大家的开发。那咱们要的是 __TypeId__ 跟 Class 之间的映射关系, 这两个映射关系的生成逻辑有什么区别吗?那我就直接说实现方案了,没有太多可以分析了,只是 方案1 的加强。

  1. 参考 Spring 的源码,找到ClassPathScanningCandidateComponentProvider(与本次逻辑无关,省略了,以后再说,再挖个坑),用于注解扫描。
  2. 定义 一个注解 @TypeId, 跟 @Component 的作用类似,标识需要 自动转换成 Message 的 Bean Class,这个注解有个值 value,配置 对应的 __TypeId__ 是什么。
  3. 扫描@TypeId 注解的 Class , 生成 Class 与 value 的映射关系
  4. 跟 方案1 一样,调用 JsonMessageConverter setIdClassMapping 设置映射关系。

具体实现

@Slf4j
@Configuration
public class RabbitConfig {
	@Bean
	public MessageConverter messageConverter(ObjectMapper mapper) {
		Jackson2JsonMessageConverter messageConverter = new Jackson2JsonMessageConverter(mapper);
		DefaultJackson2JavaTypeMapper javaTypeMapper = new DefaultJackson2JavaTypeMapper();
		// 跟方案1 一样,只不过这个Map是通过注解扫描自动生成的
		javaTypeMapper.setIdClassMapping(getTypeIds());
		messageConverter.setJavaTypeMapper(javaTypeMapper);
		return messageConverter;
	}

	/**
	* 扫描注解,自动生成映射关系
	*/
	@SneakyThrows
	private Map<String, Class<?>> getTypeIds() {
		// 不使用默认的TypeFilter
		ClassPathScanningCandidateComponentProvider provider = new ClassPathScanningCandidateComponentProvider(false);
		// 获取 @TypeId 标识的类
		provider.addIncludeFilter(new AnnotationTypeFilter(TypeId.class));
		// 修改为你项目 需要扫描的包名
		Set<BeanDefinition> beanDefinitionSet = provider.findCandidateComponents("com.XXX"); 

		Map<String, Class<?>> idClassMapping = Maps.newHashMap();
		for (BeanDefinition beanDefinition : beanDefinitionSet) {
			// 根据类名获取 Class对象
			Class<?> cls = ClassUtils.forName(beanDefinition.getBeanClassName(), RabbitConfig.class.getClassLoader());
			TypeId an = cls.getAnnotation(TypeId.class);
			// 因为默认实现, Class和 __TypeId__ 必须一一对应,所以当有重复的映射时,报错,省的真正使用的时候出现 奇怪的问题
			if (idClassMapping.containsKey(an.value())) {
				throw TypeIdMultipleValueException.of(an.value());
			}
			// 注解的value中就是 对应的 __TypeId__
			idClassMapping.put(an.value(), cls);
		}

		log.info("RabbitMQ {}的映射关系{}", AbstractJavaTypeMapper.DEFAULT_CLASSID_FIELD_NAME, idClassMapping);
		return idClassMapping;
	}

	/**
	* 自定义注解,标注需要转换的类
	*/
	@Target(ElementType.TYPE)
	@Retention(RetentionPolicy.RUNTIME)
	@Documented
	public static @interface TypeId {
		// __TypeId__ 的值
		String value();
	}

	// 跟其他异常区分开
	static class TypeIdMultipleValueException extends Exception {
		private static final long serialVersionUID = -3933351751673071122L;

		public TypeIdMultipleValueException(String message) {
			super(message);
		}

		static TypeIdMultipleValueException of(String value) {
			return new TypeIdMultipleValueException("@TypeId的value 为" + value + "在这个工程中多个");
		}
	}
}

使用案例

生产者

@TypeId("bean1")
public class ProducerBean1 {
 // ……省略无关代码……
}

// 生产者直接发送 对应实例就行了,不需要手动 构建 Message
rabbitTemplate.convertAndSend("queue.bean1", new ProducerBean1())

消费者

@TypeId("bean1")
public class ConsumerBean1 {
 // ……省略无关代码……
}

// 消费者 直接接受对应实例就行了,不需要手动解析 Message
@RabbitListener(queues = "queue.bean1")
public void listener(@Payload ConsumerBean1 bean) {
	 // ……省略具体业务代码……
}

总结

这个方案已经比较好了,生产者 和 消费者 只需有一个相同的配置类, 可以封装成 Jar 后,放到 Maven 私服上,通过 SpringBoot starter 机制自动加载(这个我也想讲,再挖个坑)。剩下的 生产者 和 消费者 就可以通过增加 注解 @TypeId, 随意的配置 Bean,只要_生产者_ 和 _消费者_对应的 __TypeId__ 相同 就可以。
但是这个方案, Class 和 __TypeId__ 还是必须一一对应,没有解决,上文中所说的 第二个问题,这个坑,我下次在填。
我列一下,我现在挖了多少坑

  1. Message 与 Bean 如何实现 多对多映射
  2. Spring 通过注解扫描 Bean 的源码分析
  3. starter 机制,Maven 私服,Maven 发布,Maven 中央仓库。
  4. 我构建MessageConverter的时候,为什么 ObjectMapper 是注入的,而不是自己构建。
  5. ……我还有其他想写,但是不能同时挖太多的坑,那会让我跳不出来的,先填了再挖。
SpringBoot+Vue集成J-IM开源框架,构建轻量级即时通讯模块实践 即时通讯(IM)作为现代应用的核心功能,其底层依赖于网络编程、长连接管理和实时数据传输协议。理解WebSocket等通信原理,是实现低延迟、双向通信的技术基础。在工程实践中,选择成熟的开源框架能有效降低开发复杂度,提升系统可控性。J-IM作为基于Netty的国产开源IM框架,封装了网络层细节,提供了连接管理、消息路由等核心能力,其价值在于为中小型项目提供了“够用且可控”的解决方案。结合SpringBoot的容器化管理和Vue的响应式前端,可以快速构建出支持实时收发消息、会话管理的聊天功能。这种技术组合适用于 阅读详情

相关推荐

SpringBoot集成LangChain4j构建生产级AI Agent

AI Agent 是大模型从单次调用迈向自主决策的关键范式,其核心在于会话管理、工具编排与状态持久化。LangChain4j 作为 Java 生态原生的 LangChain 实现,将 LLM 能力抽象为可注入、可配置、可监控的 Spring Bean,天然兼容自动装配、事务管理与 Actuator 指标体系。结合 SpringBoot 的约定优于配置理念,开发者能复用熟悉的 @Service、@Autowired 和 starter 机制,快速构建具备记忆能力(ChatMemory)、多模型切换(OpenA

weixin_30562507的博客 334

工作随笔——rabbitmq消息的序列化与反序列化(springboot)

一、需求 发送时需要将对象序列化为json字符串,接收时反序列化为对象。 二、方案 1、序列化 在任意配置类下提供RabbitTemplate的bean,覆盖Springboot的自动化配置。将消息转译器设置为springboot提供的Jackson转译器。 // 提供自定义RabbitTemplate,将对象序列化为json串 @Bean public RabbitTemplate jacksonRabbitTemplate(ConnectionFactory connectionFact

TIANQIcode 3136

SpringBoot中RedisTemplate操作List数据结构:从基础API到实战场景详解

缓存是提升应用性能的核心技术之一,其原理是将高频访问的数据存储在内存中,以减少对数据库的直接访问,从而显著降低响应延迟并提升系统吞吐量。在Java生态中,SpringBoot通过Spring Data Redis提供了与Redis集成的标准化方案,其中RedisTemplate作为核心操作模板,封装了丰富的数据结构操作。List作为Redis的关键数据结构之一,凭借其有序、可重复及支持两端操作的特性,在工程实践中具有独特的技术价值。它非常适合需要维护顺序或实现队列/栈模型的场景,例如记录用户最近操作日志、实

weixin_30321449的博客 328

Springboot集成RabbitMQ关于对象传输过程中的序列化及反序列化

1、问题介绍 在Springboot项目中使用RabbitMQ作为消息中间件使用过程中,有时候我们会使用java对象作为传输的消息,默认情况下允许使用java对象作为传输的消息,但是却有着严格的条件限制: 1、生产者和消费者中的java对象必须相同; 2、java对象中的包名也必须一致。 如果在项目中开发者和消费者属于同一个项目则没有问题,如果开发者和消费者属于不同项目则第2个条件则比较麻烦,当然也有解决办法。比如实体类作为基础包引入生产者和消费者项目中等等。 ...

weixin_39080216的博客 2328

SpringBoot应用数据加密实战:从存储、传输到展示的全链路安全方案

数据加密是保障应用安全的核心技术之一,其核心原理在于通过特定算法将明文信息转换为不可读的密文,防止未授权访问。在Java生态中,SpringBoot框架因其便捷性被广泛用于构建企业级应用,而Jasypt作为成熟的Java加密库,提供了与SpringBoot无缝集成的能力,能有效对配置文件中的敏感信息进行加密。从技术价值看,合理的数据加密策略不仅能满足等保合规要求,更能构建纵深防御体系,保护用户隐私和商业数据。在实际应用场景中,数据安全需覆盖其完整生命周期:在存储层,可通过MyBatis-Plus插件实现数据

weixin_30905133的博客 379

Redis十大数据类型全解析:从原理到实战应用

在分布式系统和高性能服务架构中,键值存储是核心基础组件之一,它通过内存存储和高效数据结构实现快速数据访问。其原理基于内存操作和多样化的数据结构支持,能够显著提升应用性能并降低数据库负载。这一技术价值在于为缓存、会话存储、实时统计等场景提供了高并发解决方案。在应用场景上,从基础的字符串缓存到复杂的流处理,覆盖了计数器、排行榜、消息队列、地理位置服务等多种需求。本文聚焦Redis的十大数据类型,深入探讨String、Hash、List、Set、Sorted Set、GEO、Bitmap、HyperLogLog、

weixin_33861800的博客 432

spring boot rabbitmq传递bean(实体类)/ JSON

spring boot使用rabbitmq传递实体类:java对象必须序列化。 实现序列化有2种方式: 1)bean对象实现Serializable接口 发送者和接收者bean对象都必须序列化 2)借助SerializationUtils工具类 &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.apache.commons&amp;lt;/groupId&amp;gt; .

Payne Yu的博客 1万+

RabbitMQ从入门到生产:交换机、死信队列与集群实战

在分布式系统中,消息队列是异步解耦与流量削峰的关键组件。RabbitMQ作为主流消息中间件,以灵活的路由模型和可靠投递机制著称。理解交换机、队列与路由键的关系,是掌握其核心原理的基础。通过发布确认、持久化和手动ACK才能构建不丢消息的生产级链路。当业务出现超时关单、异常重试等场景时,死信队列与TTL机制提供了优雅的解决方案。落地到Spring Boot实践,还需关注JSON序列化、幂等消费和集群高可用。本文结合真实项目踩坑经历,从环境部署到跨语言调用,系统梳理RabbitMQ的核心概念与工程落地要点,帮助你

weixin_31528001的博客 210

RabbitMQ之序列化与反序列化:自定义某个Object对象和Spring中的某个Object对象通过序列化和反序列化的方式进行转换(java代码实现)

*** 序列化和反序列化的接口*//*** 构造方法*//*** 将 org.springframework.amqp.core.Message 中的 body 属性反序列化成自定义的 Message* 该方法用于从 RabbitMQ服务中接收消息时,转成我们自己定义的Message对象*/@Override/**

Qynwang的博客 2832

基于SpringBoot与人脸识别技术构建高并发考勤系统后端实践

人脸识别作为计算机视觉的核心应用之一,其原理是通过算法模型提取人脸图像中的特征向量,并进行相似度比对,从而实现身份验证。这项技术因其非接触、便捷和安全性,在安防、金融支付和智能终端等领域价值显著。在企业管理场景中,传统考勤方式存在代打卡、效率低等问题,而集成人脸识别的智能考勤系统能有效提升管理效率和体验。本文聚焦于如何利用SpringBoot框架,高效集成人脸识别算法,设计并实现一个支持高并发请求的考勤系统后端。内容涵盖从系统架构设计、核心数据库表结构(如员工表、考勤记录表),到人脸注册、1:N识别比对等关

weixin_30616969的博客 502

无人车路径规划方法汇总

无人车路径规划方法汇总

weixin_44380244的博客 2558

java对象序列化与反序列化,并将其写入RabbitMQ

1、 序列化和反序列化 序列化(Serialization) 是将对象的状态信息转化为可以存储或者传输的形式的过程,一般将一个对象存储到一个储存媒介,例如档案或记忆体缓冲等,在网络传输过程中,可以是字节或者XML等格式;而字节或者XML格式的可以还原成完全相等的对象,这个相反的过程又称为反序列化; 2、Java对象的序列化和反序列化 在Java中,我们可以通过多种方式来创建对象,并且只要对象没有被回收我们都可以复用此对象。但是,我们创建出来的这些对象都存在于JVM中的堆(heap)内存中,只有JVM处于运行

Demon_HL的博客 656

Postman调试海康ISAPI接口全记录:从鉴权失败到成功修改设备名的踩坑指南

本文详细记录了使用Postman调试海康ISAPI接口的全过程,从鉴权失败到成功修改设备名的实战经验。涵盖Digest认证机制、XML请求体构造、常见错误排查及代码实现过渡,帮助开发者高效解决海康设备集成中的各种问题。

weixin_42620913的博客 660

优雅的解决SpringBoot集成RabbitMQ序列化和反序列化的思路3 与Reflections简单介绍

序 虽然说发现我打脸了,只要Spring-Amqp大于1.6就能解决,我在思路1中提出的第二个问题。但是咱们研究技术,不只是为了解决问题,还得有点自己的追求,提升自己的技术(其实是大活说出去了,不撞南墙不回头,并且已经有思路了,这个思路不落地总感觉憋屈),咱们要为Spring-Amqp小于1.6的解决这个问题。 思路1 Spring-Amqp1.4 之前,没有@RabbitListener,所以要是想监听队列,常用的有两种方式, 一种是在 Xml 中配置 <rabbit:listener-contai

future_spring的专栏 1108

Anaconda离线创建python环境

既然是离线创建python环境,就需要有一个已经创建好的python环境。所以我们有两台win10的机器,分别是A和B。两台机器都安装了anaconda。其中A可以连网,因此我们在A上创建好一个python2.7的环境py27,然后将py27移植(安装)到B上。B连不连网都无所谓。 一、机器上A上创建python2.7的环境py27 有两种方法: 方法1:使用Anaconda的图形界面。首先,点击Environments->Create,然后输入要创建的环境名称"py27",然后选择2.7,如图

FY_2018的博客 6786

将3DMax编辑的动画,导入给已经绑定蒙皮好的模型给Unity使用

现在程序猿想做独立游戏,即容易,也难。 说容易,引擎越来越傻瓜化。 说难,到哪去找靠谱的美术? 好在伟大的AssetStore(还有淘宝上)有大批不赖的资源可以用。 现成的模型,是好,但是,没有配套的动作,却是一件让人头疼的事情,即使用IK动画,也不能完美的弥补这一缺陷。 虽然Unity具备 retargeting 功能,但是,也不是万能的,很多情况下,非标准的骨骼会导致

正经的时候都在打游戏 1万+

RabbitMQ用法

本文介绍了消息队列(MQ)的核心概念与应用场景,对比了同步通讯和异步通讯的优缺点,并详细讲解了RabbitMQ的安装配置与SpringAMQP的使用方法。 同步vs异步通讯: 同步通讯时效性强但耦合度高、性能差 异步通讯通过事件驱动实现解耦,提升性能但依赖消息代理可靠性 主流MQ对比: RabbitMQ在可靠性和延迟表现优异 Kafka/RocketMQ更适合高吞吐场景 RabbitMQ实践: 通过Docker快速部署 核心概念:生产者/消费者、队列、交换机、虚拟主机 管理控制台操作演示 Spring整合:

y516369的博客 1083

ARM Cortex平台NEON指令集优化实战指南

本文为ARM Cortex平台开发者提供了一份全面的NEON指令集优化实战指南。文章从NEON的SIMD架构原理讲起,详细介绍了开发环境搭建、NEON内联函数与自动向量化两种核心编程方法、关键数据类型与指令,并通过图像饱和运算、矩阵乘法等实战案例,深入解析了性能调优技巧与常见避坑指南,旨在帮助开发者充分释放ARM处理器的并行计算潜力。

weixin_29162439的博客 259

一位Android用户的科技漫游手记

基于Kafka+ElasticSearch+MongoDB+Redis+XXL-Job日志分析系统(学习)配置即权限:从传统开源 RBAC 框架到 SPARK 的六层数据护盾,告别改权限就要改代码的魔咒。c++&MFC 用boost.asio库写的串口功能,包含发送、异步接收、打开、重连、关闭功能。Windows下NVM保姆级指南:安装、切换版本、指定路径+淘宝镜像配置,一次搞定!第2集:技术选型的智慧:Flask vs FastAPI,GLM-4 vs GPT。

slngX_s1q0w的博客 431

【即插即用模块】Transformer篇 | TCSVT 2025 | DAFM:双注意力聚合+反向跨模态筛选,特征精准捕捉并融合!

本文提出了一种双模态注意力融合模块(DAFM),用于增强多模态图像融合任务中的特征交互。该模块通过双注意力聚合机制,结合自注意力与跨模态注意力,有效提升特征融合效果。DAFM采用可学习平衡因子动态调整注意力权重,并运用深度卷积降低计算复杂度。实验结果表明,该模块能显著提升多模态图像融合质量,适用于RGB-红外等双模态视觉任务。模块代码实现简洁,可直接集成到现有网络中作为特征融合层使用。

主要更新底层视觉(去噪、超分等)相关的科研内容,形式为【论文精读】+【论文复现】 174

【嵌入式硬件】DRV8874电机驱动

1)N沟道H桥电机驱动;2)驱动1个双向有刷直流电机;3)2个单向有刷直流电机;4)4.5V-37V工作电压范围;5)集成电流感测和调节;6)成比例电流输出(IPROPI);7)可选电流调节(IMODE):逐周期或固定关断时间;8)支持1.8、3V、5V逻辑输入;9)集成保护:欠压、电荷泵欠压、过流保护、输出关闭、热关断、自动故障恢复。

qq_39200110的博客 4417

zuihou-admin-cloud SaaS型微服务快速开发平台

本项目是基于SpringCloud + SpringBoot 的 SaaS型微服务脚手架,具备用户管理、资源权限管理、网关统一鉴权、XSS防跨站攻击、自动代码生成、多存储系统、分布式事务、分布式定时任务等多个模块,支持多业务系统并行开发,支持多服务并行开发,可以作为后端服务的开发脚手架。代码简洁,架构清晰,非常适合学习和实际项目中使用。核心技术采用Nacos、Fegin、Ribbon、Zuul、Hystrix、JWT Token、Mybatis、SpringBoot、Seata、Sentinel、Rabbi

t244387066的博客 1352

RK3588 , 基于mpp 解码 Jpeg To RGB

本文介绍了在RK3588开发板上使用Rockchip MPP(Media Process Platform)硬件加速接口将JPEG图像解码为RGB格式的完整流程。主要包括三个关键步骤:1) 读取JPEG文件数据;2) 配置MPP解码器,包括初始化上下文、设置RGB888输出格式和解码参数;3) 执行解码任务并将结果保存为图像文件。通过硬件加速,该方法能高效完成JPEG到RGB的转换,适用于嵌入式多媒体处理场景。

J。 1210

AI Agent架构设计:借鉴微服务思想的“一个目录一个Agent”实践

在构建复杂AI应用时,如何有效管理多个智能体(Agent)的协作与维护是核心挑战。借鉴成熟的微服务架构思想,将每个AI Agent视为独立的服务单元,通过高内聚、低耦合的原则进行设计,可以显著提升系统的可维护性和扩展性。这种架构模式的核心技术价值在于实现了职责分离、独立部署和灵活编排,使得开发团队能够并行开发、测试和迭代不同的AI能力。在实际应用场景中,它特别适用于自动化客服、内容生成流水线、数据分析助手等多步骤工作流。本文以Vercel Eve项目的“一个目录一个Agent”理念为例,深入解析了如何通过物

weixin_30444105的博客 406

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

rabbitmq管理页面发送消息(对象)

Delivery mode: 是否持久化,1 - Non-persistent,2 - Persistent Headers:Headers can have any name. Only long string headers can be set here.TypeId: 消息体实体类类型 当需要在消费端对应实体类接受时 需要设置该属性 值为对应实体类在项目下的全路径 ${包名.类名} 1 Properties: You can set other message properties here (de

Amelia_Liu的博客 1873

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

RabbitMQ消息的可靠性投递

今天来说一下RabbitMQ的消息可靠性投递,先看一下图 从图上可以看到从发送消息到消息最后的消费的链路是:生产者把消息发送到Brocker(Brocker把消息给对应的交换机),交换机把消息投递给对应的队列,消费者监听对应的队列进行消费 所以消息的可靠投递分为了两大内容:发送端的确认(也就是p到b和e到q)和消费端的确认(也就是q到c) 一、发送端确认 发送端的确认又分为了消息到达Brocker的确认和消息到达队列的确认 1、消息到达Brocker的确认 当消息安全抵达Brocker后,.

曹举的个人博客 803

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

上一篇: 优雅的解决SpringBoot集成RabbitMQ序列化和反序列化的思路1
下一篇: 在Jfinal,用Groovy实现类似Spring对application/json的处理插件
明日之春
博客等级 码龄15年 3粉丝 8原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值