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

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

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

链路追踪发布于 2026/3/22更新于 2026/8/2352 浏览
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;
import org.springframework.web.bind.annotation.RestController;
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 "下单成功";
    }
}

编写物流代码

配置文件 (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. 编写物流代码
  • 免费图片AI生成工具免费生成了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 免费图片视频在线生成30秒,将你的创意变成现实开始设计
  • X/Twitter免费视频下载器免登陆无限额度免费视频解析下载了解详情
  • 100+免费在线小游戏爽一把
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • Arduino BLDC 自适应阻抗控制外骨骼机器人
  • 阿里云配置 Zabbix 邮件发送
  • StreamVLN 具身导航复现与推理实战
  • 基于 AI 辅助的高校宿舍管理系统设计与实现
  • VS Code 集成 GitHub Copilot 使用指南
  • Python 垂直爬虫系统实现方法详解
  • 视觉 - 骨架双模态框架用于帕金森病步态的泛化评估
  • llama.cpp Docker 镜像国内加速下载方法
  • C++ 面向对象核心:继承机制详解
  • Java 连接 SQL Server 的两种 JDBC 实现方式
  • Python 图算法模块:Dijkstra 与 Floyd-Warshall 实现原理与应用
  • 宇树机器人 G1 二次开发:基于 FAST-LIO 的建图与 RViz 配置
  • Prompt 提示词工程核销逻辑与高效 AI 交互
  • Unity 基于 Rokid AR 眼镜的图像识别与实时跟踪方案
  • Flutter for OpenHarmony 动态换肤:Material Color Utilities 算法实战
  • 渗透测试基本流程详解与常用工具
  • 前端开发三年职业历程回顾:理想与现实的碰撞
  • C++ 游戏开发入门与进阶指南
  • Linux 信号捕捉与处理机制
  • 五种常用的web加密算法

相关免费在线工具

  • 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