【Rabbit基础篇】声明组件与 JSON 消息转换器深度解析
个人主页代码不加冰欢迎来访作者简介java后端学习者❄️个人专栏LeetCode刷题日记 苍穹外卖日记SSM框架深入JavaWeb✨命运的结局尽可永在不屈的挑战却不可须臾或缺前言大家好我是代码不加冰在这里祝大家端午安康可惜在学校吃不到老家的粽子只有蜜枣的那种不知道有没有懂得还是挺想念的。闲话就不多说了由于是期末周重心还是应对期末考试我们这里主要是接着前面的RabbitMQ消息队列继续深入忙着别的专题搁置了一段时间我们继续拾起来同样的还有算法和八股都要带着学习了。摘要本文介绍了RabbitMQ消息队列在Java中的两种主流声明方式通过Spring AMQP配置类或注解和原生Java客户端。重点讲解了Spring AMQP的配置方法包括交换机、队列的声明及绑定关系设置并对比了两种方式的优缺点。此外详细说明了消息转换器的作用推荐使用Jackson JSON转换器替代默认实现以实现跨语言兼容和更好的可读性。文章还提供了核心参数的避坑指南帮助开发者正确处理组件生命周期问题。最后展示了如何通过RabbitTemplate优雅地发送和接收自定义对象消息。Java客户端组件声明在 Java 客户端中声明队列和交换机主要有两种主流方式一种是使用RabbitMQ 原生 Java 客户端AMQP Client另一种是使用Spring BootSpring AMQP。在实际企业开发中Spring Boot 方式最为常用因为它通过注解或配置类将声明过程高度抽象化了。方式一使用 Spring Boot (Spring AMQP)Spring AMQP 提供了两种声明方式配置类Bean 注入和注解驱动。1.1 通过配置类Configuration声明这种方式结构清晰适合在项目启动时统一管理队列和交换机。import org.springframework.amqp.core.*; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; Configuration public class RabbitConfig { // 1. 声明交换机 (以 Topic 类型为例) Bean public TopicExchange topicExchange() { // 参数交换机名称、是否持久化、是否自动删除 return new TopicExchange(boot.topic.exchange, true, false); } // 2. 声明队列 Bean public Queue myQueue() { // 参数队列名称、是否持久化、是否排他、是否自动删除 return new Queue(boot.topic.queue, true, false, false); } // 3. 声明绑定关系 (将队列绑定到交换机并指定 Routing Key) Bean public Binding bindingQueueToExchange(Queue myQueue, TopicExchange topicExchange) { return BindingBuilder .bind(myQueue) .to(topicExchange) .with(boot.#); // 路由键匹配规则 } }1.2 通过注解RabbitListener动态声明如果我们不想写一堆配置类可以在消费者监听消息时直接在注解中动态创建。import org.springframework.amqp.rabbit.annotation.*; import org.springframework.stereotype.Component; Component public class RabbitConsumer { RabbitListener(bindings QueueBinding( value Queue(name boot.anno.queue, durable true), exchange Exchange(name boot.anno.exchange, type topic), key anno.# )) public void listen(String message) { System.out.println(接收到消息: message); } }方式二使用 RabbitMQ 原生 Java 客户端如果不使用 Spring 框架纯 Java 项目需要通过Channel对象的 API 来显式声明。import com.rabbitmq.client.Channel; import com.rabbitmq.client.Connection; import com.rabbitmq.client.ConnectionFactory; public class RabbitNativeDeclare { public static void main(String[] args) throws Exception { // 1. 创建连接工厂并建立连接 ConnectionFactory factory new ConnectionFactory(); factory.setHost(localhost); factory.setUsername(guest); factory.setPassword(guest); try (Connection connection factory.newConnection(); Channel channel connection.createChannel()) { String exchangeName native.direct.exchange; String queueName native.direct.queue; String routingKey native.key; // 2. 声明交换机 // 参数: exchange, type, durable, autoDelete, arguments channel.exchangeDeclare(exchangeName, direct, true, false, null); // 3. 声明队列 // 参数: queue, durable, exclusive, autoDelete, arguments channel.queueDeclare(queueName, true, false, false, null); // 4. 绑定队列和交换机 // 参数: queue, exchange, routingKey channel.queueBind(queueName, exchangeName, routingKey); System.out.println(原生客户端交换机、队列及绑定关系创建成功); } } }核心参数避坑指南无论使用哪种方式声明时的几个布尔值Boolean参数至关重要决定了组件的生命周期Durable (持久化)true推荐RabbitMQ 服务重启后交换机/队列依然存在。false重启后消失。AutoDelete (自动删除)true当没有消费者连接这个队列或没有队列绑定这个交换机时自动将其销毁。false推荐即使没人用也一直保留。Exclusive (排他队列)true只对首次声明它的连接Connection可见且连接断开时队列会自动删除。通常用于临时、单消费者场景。注意如果 RabbitMQ 中已经存在同名的队列或交换机但代码中声明的参数如durable状态与服务端现有的不一致程序会直接报错406 PRECONDITION_FAILED。修改参数时需要先去 RabbitMQ 管控台手动删除旧的组件。消息转换器在 RabbitMQ 的 Java 客户端中消息转换器MessageConverter是一个非常重要的组件。简单来说网络传输只能识别字节流byte[]而我们在 Java 代码里使用的是各种对象如String、User、Map等。发送消息时需要把 Java 对象变成byte[]序列化。接收消息时需要把byte[]变回 Java 对象反序列化。如果不使用消息转换器你每次发消息都得手动写代码去转字节数组非常痛苦。1. 原生 Java 客户端 vs Spring AMQP原生 Java 客户端com.rabbitmq.client没有内置的高级消息转换器。你必须手动将对象转成 JSON 字符串再转成byte[]才能发送。Spring AMQPSpring Boot自带了MessageConverter接口并且提供了完美的自动化支持。只要配置好你直接扔一个 Java 对象给它它会自动帮你转。因此我们重点讲解Spring Boot中的消息转换器。2. 默认的转换器如果你在 Spring Boot 中不做任何配置默认使用的是SimpleMessageConverter。它是怎么工作的它使用的是 Java 原生的序列化机制ObjectOutputStream。缺点可读性极差在 RabbitMQ 管控台看消息全是\xAC\xED\x00\x05sr\x00...这样的二进制乱码。体积大占用更多的网络带宽和磁盘空间。安全性与跨语言问题其他语言如 Python、Go很难解析 Java 原生序列化的数据。3. 最佳实践配置 JSON 消息转换器在企业开发中几乎100% 都会将其替换为 Jackson JSON 转换器。第一步在配置类中注入 Bean你只需要在项目中任何一个Configuration类里向 Spring 容器注入Jackson2JsonMessageConverter即可。Spring AMQP 会自动识别并切换。import org.springframework.amqp.support.converter.Jackson2JsonMessageConverter; import org.springframework.amqp.support.converter.MessageConverter; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; Configuration public class RabbitConfig { // 只要配置了这个 Bean发送和接收都会自动使用 JSON Bean public MessageConverter jsonMessageConverter() { return new Jackson2JsonMessageConverter(); } }第二步发送对象配置好后使用RabbitTemplate发送消息时你可以直接传一个自定义的对象无需实现Serializable接口Autowired private RabbitTemplate rabbitTemplate; public void sendUserMessage() { User user new User(张三, 18); // 自动转换为 JSON 字符串 {name:张三,age:18} 的字节流发送 rabbitTemplate.convertAndSend(amqp.exchange, user.key, user); }第三步优雅地接收对象在消费者端直接用对应的实体类接收Spring 会自动把 JSON 解析回 Java 对象RabbitListener(queues user.queue) public void listenUser(User user) { // 直接接收对象 System.out.println(收到用户消息 user.getName() , 年龄 user.getAge()); }4. 它是怎么知道应该转成什么对象的我们可能会好奇RabbitMQ 队列里存的明明只是纯文本的 JSON 字符串消费者怎么知道要把它反序列化成User类而不是Order类这就涉及到 AMQP 消息的核心结构了。一条消息由两部分组成Body消息体即 JSON 字符串。Properties消息头/属性关键就在这里当使用Jackson2JsonMessageConverter发送消息时它会在消息头中自动添加一个属性__TypeId__:com.example.domain.User对象的全类名当消费者收到消息时转换器会去读这个__TypeId__从而知道我要把它转成User对象然后帮你在后台默默完成转换。结语如果对你有帮助请点赞关注收藏你的支持就是我最大的鼓励

相关新闻

2000-2024年国内投资事件数据库

2000-2024年国内投资事件数据库

数据介绍数据整理国内在中国境内的企业股权融资、并购及资本运作事件,包括私募股权融资并购再融资等行为,指标包括融资类型,融资次数,融资金额等。数据名称:国内投资事件数据库数据年份:2000-2024年数据指标…

2026/6/20 11:03:48阅读更多 →
ComfyUI-Manager终极安装指南:5个常见问题解决方案与专业配置技巧

ComfyUI-Manager终极安装指南:5个常见问题解决方案与专业配置技巧

ComfyUI-Manager终极安装指南:5个常见问题解决方案与专业配置技巧 【免费下载链接】ComfyUI-Manager ComfyUI-Manager is an extension designed to enhance the usability of ComfyUI. It offers management functions to install, remove, disable, and enable va…

2026/6/20 11:03:48阅读更多 →
Jest 实践指南:5 分钟学会编写你的第一个测试用例

Jest 实践指南:5 分钟学会编写你的第一个测试用例

Jest 实践指南:5 分钟学会编写你的第一个测试用例 【免费下载链接】jest-tutorial 🃏《Jest 实践指南》 项目地址: https://gitcode.com/gh_mirrors/je/jest-tutorial Jest 是一款功能强大的 JavaScript 测试框架,能够帮助开发者快速编…

2026/6/20 11:03:48阅读更多 →
3分钟掌握专业级色彩:开源novideo_srgb让广色域显示器回归真实

3分钟掌握专业级色彩:开源novideo_srgb让广色域显示器回归真实

3分钟掌握专业级色彩:开源novideo_srgb让广色域显示器回归真实 【免费下载链接】novideo_srgb Calibrate monitors to sRGB or other color spaces on NVIDIA GPUs, based on EDID data or ICC profiles 项目地址: https://gitcode.com/gh_mirrors/no/novideo_srg…

2026/6/20 12:23:53阅读更多 →
MPC5644A引脚电气特性解析与汽车电子硬件设计实战

MPC5644A引脚电气特性解析与汽车电子硬件设计实战

1. MPC5644A引脚功能深度解析在汽车电子和工业控制领域,MPC5644A是一款久经考验的高性能32位微控制器。对于硬件工程师而言,数据手册中那密密麻麻的引脚定义和电气参数表格,既是设计的“圣经”,也常常是令人望而生畏的“天书”。很…

2026/6/20 12:23:53阅读更多 →
从乐谱扫描到数字音乐:Audiveris与MuseScore完美搭档指南

从乐谱扫描到数字音乐:Audiveris与MuseScore完美搭档指南

从乐谱扫描到数字音乐:Audiveris与MuseScore完美搭档指南 【免费下载链接】audiveris Latest generation of Audiveris OMR engine 项目地址: https://gitcode.com/gh_mirrors/au/audiveris 你是否有一堆尘封的纸质乐谱,想要将它们变成可以在电脑…

2026/6/20 12:23:53阅读更多 →
NXP智能门禁硬件设计解析:触摸、NFC与无线模块实战指南

NXP智能门禁硬件设计解析:触摸、NFC与无线模块实战指南

1. 项目概述与核心思路最近在做一个智能门禁的硬件方案选型和原理图设计,核心需求是集成多种身份验证方式(如触摸按键、NFC刷卡)和无线通信能力(如蓝牙、UWB),同时要兼顾低功耗和安全性。NXP的SLN-SMART-AC…

2026/6/20 12:23:53阅读更多 →
AMD Ryzen硬件调试终极指南:深入掌握SMU Debug Tool的10个核心技巧

AMD Ryzen硬件调试终极指南:深入掌握SMU Debug Tool的10个核心技巧

AMD Ryzen硬件调试终极指南:深入掌握SMU Debug Tool的10个核心技巧 【免费下载链接】SMUDebugTool A dedicated tool to help write/read various parameters of Ryzen-based systems, such as manual overclock, SMU, PCI, CPUID, MSR and Power Table. 项目地址…

2026/6/20 12:23:53阅读更多 →
TWR-K65F180M评估板:基于Cortex-M4的嵌入式原型开发实战指南

TWR-K65F180M评估板:基于Cortex-M4的嵌入式原型开发实战指南

1. 项目概述:从芯片到系统的原型验证利器在嵌入式开发领域,尤其是涉及工业控制、物联网网关或需要复杂人机交互的设备时,选对微控制器(MCU)只是第一步,如何快速、高效地验证你的想法并将其转化为可工作的原…

2026/6/20 12:18:52阅读更多 →
【课程设计/毕业设计】基于 Web 的高校县志馆藏信息综合管理系统设计与实现 基于Django的青岛滨海学院特色文献捐赠流转管理系统的设计与实现【附源码、数据库、万字文档】

【课程设计/毕业设计】基于 Web 的高校县志馆藏信息综合管理系统设计与实现 基于Django的青岛滨海学院特色文献捐赠流转管理系统的设计与实现【附源码、数据库、万字文档】

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

2026/6/20 0:02:40阅读更多 →
MC68HC908RF2A定时器PWM生成原理与实战:无缓冲与缓冲模式详解

MC68HC908RF2A定时器PWM生成原理与实战:无缓冲与缓冲模式详解

1. 项目概述与核心价值在嵌入式开发,尤其是电机驱动、LED调光、开关电源这些需要精确控制“能量”的领域,脉冲宽度调制(PWM)技术是工程师手中的一把瑞士军刀。它的本质很简单:用一个固定频率的方波,通过改变…

2026/6/20 0:02:40阅读更多 →
在银河麒麟V10桌面(2205版本)上实战部署软RAID 1:从模块黑名单到自动挂载

在银河麒麟V10桌面(2205版本)上实战部署软RAID 1:从模块黑名单到自动挂载

1. 银河麒麟V10桌面系统与软RAID 1基础认知 第一次在银河麒麟V10桌面上折腾软RAID 1时,我踩了不少坑。这个国产操作系统基于Linux内核,但2205版本对软RAID模块做了特殊处理,需要额外操作才能正常使用。软RAID 1其实就是磁盘镜像技术&#xff…

2026/6/20 0:02:40阅读更多 →