详解SpringBoot+RabbitMQ完成应用通信

详解SpringBoot+RabbitMQ完成应用通信

目录

应用通信

需求描述

创建项目

创建空项目

创建Module(order-service)

创建Module(logistics-service)

消息类型为字符串

编写订单代码

编写物流代码

生产订单

消费订单

消息类型为对象

新增Module

编写订单代码

生产对象类型订单消息

解决办法1(实现序列化接口)

解决办法2(设置消息转换类型)

编写物流代码

消费对象类型订单消息

解决办法


应用通信

作为⼀个消息队列, RabbitMQ也可以⽤作应⽤程序之间的通信. 上述代码⽣产者和消费者代码放在不同的应⽤中即可完成不同应⽤程序的通信.
接下来我们来看, 基于SpringBoot+RabbitMQ完成应⽤间的通信.

需求描述

⽤⼾下单成功之后, 通知物流系统, 进⾏发货。

订单系统作为⼀个⽣产者, 物流系统作为⼀个消费者。

创建项目
创建空项目
创建Module(order-service)

添加依赖

创建Module(logistics-service)

添加依赖

消息类型为字符串
编写订单代码

添加配置

spring: application: name: order-service rabbitmq: addresses: amqp://study:[email protected]:5672/order

声明队列

import org.springframework.amqp.core.Queue; import org.springframework.amqp.core.QueueBuilder; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class RabbitMQConfig { @Bean("orderQueue") public Queue orderQueue() { return QueueBuilder.durable("order.create").build(); } }

生产订单

import org.springframework.amqp.rabbit.core.RabbitTemplate; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import java.util.Random; import java.util.UUID; @RequestMapping("/order") @RestController public class OrderController { @Autowired private RabbitTemplate rabbitTemplate; @RequestMapping("create") public String create(){ String orderId= UUID.randomUUID().toString(); rabbitTemplate.convertAndSend("","order.create","订单信息,订单ID:"+orderId); return "下单成功"; } }
编写物流代码

添加配置

spring: application: name: logistics-service rabbitmq: addresses: amqp://study:[email protected]:5672/order server: port: 9090

声明队列

import org.springframework.amqp.core.Queue; import org.springframework.amqp.core.QueueBuilder; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class RabbitMQConfig { @Bean("order.create") public Queue createOrder() { return QueueBuilder.durable("order.create").build(); } }

消费订单

import org.springframework.amqp.rabbit.annotation.RabbitListener; import org.springframework.stereotype.Component; @Component public class OrderListener { @RabbitListener(queues = "order.create") public void handMessage(String orderInfo) { System.out.println("接收到订单消息"+orderInfo); } }
生产订单
消费订单

可以看到,订单已经被成功消费了,结果符合预期。 

消息类型为对象

下面的代码是以上面代码的基础,并进行增添删除编写而成的。

新增Module

因为订单系统和物流系统在生产和消费对象类型的消息时,会用到同一个结构体,为了便于代码编写,新增Module,把OrderInfo放到新增的Module中。

import lombok.Data; @Data public class OrderInfo{ private String orderId; private String name; }
编写订单代码

在order-service项目的OrderController中添加如下代码:

 @RequestMapping("create2") public String create2(){ OrderInfo orderInfo=new OrderInfo(); orderInfo.setOrderId(UUID.randomUUID().toString()); orderInfo.setName("商品"+new Random().nextInt(100)); rabbitTemplate.convertAndSend("","order.create",orderInfo); return "下单成功"; }
生产对象类型订单消息

此时我们发现抛异常了,异常信息为SimpleMessageConverter只支持String, byte[] and Serializable类型的payloads,但是接收到的是order.model.OrderInfo对象。

解决办法1(实现序列化接口)

修改order-service下的OrderInfo类

import lombok.Data; import java.io.Serializable; @Data public class OrderInfo implements Serializable { private String orderId; private String name; }

虽然成功生成了对象类型的订单消息,但是我们看到消息的Payload并不直观,下面我们将采用两一种解决办法。

解决办法2(设置消息转换类型)

修改order-service中的OrderInfo

import lombok.Data; @Data public class OrderInfo{ private String orderId; private String name; }

查看RabbitTemplated的setMessageConverter方法,查看MessageConverter接口的实现类,我们将使用Jackson2JsonMessageConverter。

修改order-service中的RabbitMQConfig

import org.springframework.amqp.core.Queue; import org.springframework.amqp.core.QueueBuilder; import org.springframework.amqp.rabbit.connection.ConnectionFactory; import org.springframework.amqp.rabbit.core.RabbitTemplate; import org.springframework.amqp.support.converter.Jackson2JsonMessageConverter; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class RabbitMQConfig { @Bean("orderQueue") public Queue orderQueue() { return QueueBuilder.durable("order.create").build(); } @Bean public Jackson2JsonMessageConverter jsonMessageConverter(){ return new Jackson2JsonMessageConverter(); } @Bean public RabbitTemplate rabbitTemplate(ConnectionFactory factory, Jackson2JsonMessageConverter jsonMessageConverter){ RabbitTemplate rabbitTemplate = new RabbitTemplate(factory); rabbitTemplate.setMessageConverter(jsonMessageConverter); return rabbitTemplate; } }

再次生产对象类型订单消息

此时再次查看队列中的消息,我们可以看到消息的Payload是非常直观的!!!

编写物流代码

修改logistics-service中的代码

import logistics.model.OrderInfo; import org.springframework.amqp.rabbit.annotation.RabbitListener; import org.springframework.stereotype.Component; @Component @RabbitListener(queues = "order.create") public class OrderListener { public void handMessage(String orderInfo) { System.out.println("接收到订单消息"+orderInfo); } public void handMessage(OrderInfo orderInfo) { System.out.println("接收到订单消息"+orderInfo); } }
消费对象类型订单消息

但是过了许久,我们也没有看到队列中的消息被消费!!!

解决办法

原因是因为@RabbitListener(queues = "order.create")注解声明在类上面时,须结合@RabbitHandler注解来使用!!!

修改logistics-service中的代码

import logistics.model.OrderInfo; import org.springframework.amqp.rabbit.annotation.RabbitHandler; import org.springframework.amqp.rabbit.annotation.RabbitListener; import org.springframework.stereotype.Component; @Component @RabbitListener(queues = "order.create") public class OrderListener { @RabbitHandler public void handMessage(String orderInfo) { System.out.println("接收到订单消息"+orderInfo); } @RabbitHandler public void handMessage(OrderInfo orderInfo) { System.out.println("接收到订单消息"+orderInfo); } }

此时消费消息,但是发现又抛异常了

原因是因为,我们的确是针对生产对象类型消息的一方设置了MessageConverter,但是我们没有给消费对象类型消息的一方设置MessageConverter,导致消费对象类型消息的一方没有办法正确解析出消息。

解决办法,依旧是添加MessageConverter!!!

修改logistics-service中的RabbitMQConfig

import org.springframework.amqp.core.Queue; import org.springframework.amqp.core.QueueBuilder; import org.springframework.amqp.rabbit.connection.ConnectionFactory; import org.springframework.amqp.rabbit.core.RabbitTemplate; import org.springframework.amqp.support.converter.Jackson2JsonMessageConverter; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class RabbitMQConfig { @Bean("order.create") public Queue createOrder() { return QueueBuilder.durable("order.create").build(); } @Bean public Jackson2JsonMessageConverter jsonMessageConverter(){ return new Jackson2JsonMessageConverter(); } @Bean public RabbitTemplate rabbitTemplate(ConnectionFactory factory, Jackson2JsonMessageConverter jsonMessageConverter){ RabbitTemplate rabbitTemplate = new RabbitTemplate(factory); rabbitTemplate.setMessageConverter(jsonMessageConverter); return rabbitTemplate; } }

再次消费消息 

此时我们可以看到,对象类型的订单消息可以正常消费了,符合预期。

Read more

Pi0大模型多场景落地:新能源电池拆解机器人安全指令理解应用

Pi0大模型多场景落地:新能源电池拆解机器人安全指令理解应用 1. 为什么电池拆解需要更聪明的机器人? 新能源汽车退役潮正在加速到来。据行业统计,2025年我国退役动力电池预计超100万吨——这些电池里藏着钴、镍、锂等高价值金属,回收率每提升10%,相当于新增一座中型矿山。但现实很骨感:当前90%以上的电池包仍靠人工拆解。工人要徒手拧开上百颗防爆螺栓,用万用表逐个检测电芯残压,稍有不慎就可能引发热失控甚至起火。 传统工业机器人在这里“失语”了。它们能精准重复动作,却看不懂一张带锈迹的电池模组照片,听不懂“先断开高压母线,再取下BMS板”这样的分步指令,更无法在电芯鼓包、绝缘层破损等异常状态下自主调整操作力度。这不是精度问题,而是理解力缺失。 Pi0模型的出现,恰恰切中这个痛点。它不是又一个“会动的机械臂”,而是一个真正能“看、听、想、做”的机器人操作系统内核。在某新能源回收企业的真实产线测试中,搭载Pi0的拆解机器人首次实现了对三元锂电池包的全流程自主识别与安全操作:从判断电池包是否已放电完毕,到识别不同型号的固定结构,再到根据指令动态选择拆解路径——整个过程无需预编程,仅靠

By Ne0inhk

EgoPoseFormer v2:解决 AR/VR 场景中的第一视角人体动捕问题

目录 一、前言 二、EgoPoseFormer v2 核心内容总结 1. 研究背景与挑战 2. EPFv2 的核心创新 3. 实验结果 4. 应用价值 三、DeepSeek是不是发布过关于图像识别顺序的因果时间注意力机制?         3.1 它们各自是怎么实现的,技术上有没有底层的联系和区别? 1.DeepSeek的“视觉因果流” (空间逻辑重排) 2.Meta EPFv2的“因果时间注意力” (时间逻辑依赖) 3.底层联系与核心区别 4.总结 四、EPFv2和DeepSeek OCR2和SAM2跟踪的区别和联系         4.1 EPFv2和DeepSeek OCR2和SAM2跟踪的区别和联系是什么?         4.2 技术上的相似性 🧩 不同的应用方式:从“基础模块”到“特定智能”

By Ne0inhk

4步精通:AI人脸修复工具GFPGAN的跨平台部署与应用指南

4步精通:AI人脸修复工具GFPGAN的跨平台部署与应用指南 【免费下载链接】GFPGANTencentARC/GFPGAN: GFPGAN(GFPGAN: Real-World Blind Face Restoration with PULSE++)是由腾讯ARC实验室研发的一个基于深度学习的人脸图像修复工具,主要用于低质量人脸图像的超分辨率恢复。 项目地址: https://gitcode.com/gh_mirrors/gf/GFPGAN GFPGAN作为腾讯ARC实验室研发的深度学习人脸修复工具,能够将低质量人脸图像恢复至高清状态。本文将系统讲解该工具在Windows、Linux和Mac系统上的部署流程,帮助技术用户快速掌握这一强大的图像修复解决方案。 核心环境配置指南 基础依赖要求 GFPGAN运行需要以下核心组件: * Python 3.7及以上版本(推荐Anaconda环境) * PyTorch 1.7.0及更高版本 * 可选的NVIDIA GPU加速支持(推荐使用) 操作系统适配说明 * Windows系统:Windows 10/11 64位版本

By Ne0inhk

KaiwuDB+CodeArts 智能体,让ai快速构建一个智能家居本地化数据处理系统

针对智能家居云端数据处理模式的网络依赖、低延迟性差、隐私泄露三大痛点,基于 KaiwuDB(KWDB)多模时序数据库 + 华为 CodeArts 代码智能体的本地化数据处理解决方案。从环境搭建、KWDB 自动化部署,到系统全模块开发、接口测试实现全流程落地,打造零云端依赖、低延迟、高隐私的智能家居本地化数据处理系统,方案基于开源技术栈与自动化开发工具,降低技术门槛,适配新手开发者与实际家庭场景需求。         随着智能家居设备渗透率持续提升,家庭中温湿度传感器、智能灯、空调、门锁等设备呈规模化增长,设备运行产生的时序数据(温湿度、能耗、设备状态)与关系型数据(设备信息、规则配置)呈爆发式增长,对数据的存储、处理与利用提出更高要求。 本文选择KaiwuDB作为本地化数据存储与计算核心,华为 CodeArts 代码智能体作为自动化研发引擎,二者结合实现智能家居本地化数据处理系统的高效构建,核心优势如下: 1.1 KaiwuDB:适配 AIoT 场景的多模数据库基座 KaiwuDB(开源版本简称

By Ne0inhk