跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客我的书AI学习GitHub 精选镜像AI工具UI配色美学关于
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
Javajava

SpringBoot 结合 RabbitMQ 实现应用间通信详解

基于 SpringBoot 和 RabbitMQ 演示微服务间通信。以订单系统和物流系统为例,分别实现了字符串和对象类型的消息传递。针对对象消息,对比了实现 Serializable 接口和使用 Jackson2JsonMessageConverter 的两种方案,并指出消费者端同样需要配置 MessageConverter 才能正确反序列化。最终实现了跨应用的消息生产与消费。

链路追踪发布于 2026/3/22更新于 2026/10/25101 浏览
SpringBoot 结合 RabbitMQ 实现应用间通信详解

SpringBoot 与 RabbitMQ 实现应用间通信

RabbitMQ 可作为消息队列用于应用程序之间的通信。通过在生产者和消费者代码分别部署于不同应用中,即可完成跨应用通信。

需求描述

用户下单成功后,通知物流系统进行发货。

  • 订单系统:生产者
  • 物流系统:消费者

创建项目

1. 创建空项目

新建一个 Maven/Gradle 多模块项目。

2. 创建 Module(order-service)

添加 Spring Boot 和 RabbitMQ 依赖。

3. 创建 Module(logistics-service)

添加 Spring Boot 和 RabbitMQ 依赖。

消息类型为字符串

编写订单代码

配置文件 (application.yml)

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;
 org.springframework.web.bind.annotation.RestController;
 java.util.UUID;



   {
    
     RabbitTemplate rabbitTemplate;

    
     String  {
           UUID.randomUUID().toString();
        rabbitTemplate.convertAndSend(, ,  + orderId);
         ;
    }
}
import
import
@RequestMapping("/order")
@RestController
public
class
OrderController
@Autowired
private
@RequestMapping("create")
public
create
()
String
orderId
=
""
"order.create"
"订单信息,订单 ID:"
return
"下单成功"

编写物流代码

配置文件 (application.yml)

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,将 OrderInfo 类放入其中供双方引用。

import lombok.Data;

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

编写订单代码

在 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。

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

修改 OrderInfo 类实现 Serializable 接口:

import lombok.Data;
import java.io.Serializable;

@Data
public class OrderInfo implements Serializable {
    private String orderId;
    private String name;
}

虽然可以发送,但 Payload 不直观。

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

使用 Jackson2JsonMessageConverter 使 Payload 更直观。

配置 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;
    }
}

编写物流代码

消费对象类型订单消息

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);
    }
}

注意:当 @RabbitListener 注解声明在类上时,须结合 @RabbitHandler 注解来区分不同的处理方法。

若仍无法解析,原因是消费者端未配置 MessageConverter。需在 logistics-service 的 RabbitMQConfig 中同样添加 Jackson2JsonMessageConverter 和 RabbitTemplate Bean 的配置。

配置完成后,对象类型的订单消息即可正常消费。

目录

  1. SpringBoot 与 RabbitMQ 实现应用间通信
  2. 需求描述
  3. 创建项目
  4. 1. 创建空项目
  5. 2. 创建 Module(order-service)
  6. 3. 创建 Module(logistics-service)
  7. 消息类型为字符串
  8. 编写订单代码
  9. 编写物流代码
  10. 消息类型为对象
  11. 编写订单代码
  12. 解决办法 1:实现序列化接口
  13. 解决办法 2:设置消息转换类型
  14. 编写物流代码

更多推荐文章

查看全部
  • 华为 CANN 架构与 AI 开发实践指南
  • OpenClaw 电商自动化实战:商品上下架、智能客服与订单统计
  • 利用 DeepSeek 降低论文 AIGC 检测率的指令与工具指南
  • Bright Data MCP:AI 实时网络数据采集方案
  • Llama-3.2-3B 部署实战:Ollama 镜像免配置与 Mac M1/M2 原生运行实测
  • Spring AI 多轮对话与记忆机制实战:构建高可用智能客服
  • Unity VR Pico 开发环境搭建与发布指南
  • 2024 信奥赛 C++ 提高组 CSP-S 复赛真题及题解:决斗
  • MCPHost:命令行大模型与外部工具交互实践
  • 宇树 Unitree 机器人 ROS 2 环境部署指南 (Go2/B2/H1)
  • 2024 北京养老服务行业发展四季青论坛举办,发布养老行业千亿大模型
  • 网络安全岗位详解与就业前景分析
  • LG WebOS 电视 Homebrew Channel 第三方应用安装与配置指南
  • 如何将 Python 文件打包为可执行 EXE 程序
  • ChatGPT 到 AI 大模型私有化部署:企业技术选择分析
  • Nginx 核心功能与配置指南
  • YOLO26-Pose 零样本姿态估计实战:机器人视觉新范式
  • FPGA 跨时钟域 CDC 处理的三种工程方案
  • Flink 作业提交流程详解与大数据开发面试指南
  • Python 接入 IPIDEA API 实现 eBay 商品数据全自动化采集

相关免费在线工具

  • Keycode 信息

    查找任何按下的键的javascript键代码、代码、位置和修饰符。 在线工具,Keycode 信息在线工具,online

  • Escape 与 Native 编解码

    JavaScript 字符串转义/反转义;Java 风格 \uXXXX(Native2Ascii)编码与解码。 在线工具,Escape 与 Native 编解码在线工具,online

  • JavaScript / HTML 格式化

    使用 Prettier 在浏览器内格式化 JavaScript 或 HTML 片段。 在线工具,JavaScript / HTML 格式化在线工具,online

  • JavaScript 压缩与混淆

    Terser 压缩、变量名混淆,或 javascript-obfuscator 高强度混淆(体积会增大)。 在线工具,JavaScript 压缩与混淆在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online