在Spring Boot中集成RabbitMQ的实战记录

2025-06-25 17:50

本文主要是介绍在Spring Boot中集成RabbitMQ的实战记录,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

《在SpringBoot中集成RabbitMQ的实战记录》本文介绍SpringBoot集成RabbitMQ的步骤,涵盖配置连接、消息发送与接收,并对比两种定义Exchange与队列的方式:手动声明(...

前言

在现代微服务架构中,消息队列(Message Queue)是实现异步通信、解耦系统组件的重要工具。RabbitMQ 是一个流行的消息中间件,支持多种消息协议,具有高可靠性和可扩展性。

本博客将详细介绍如何在 Spring Boot 项目中集成 RabbitMQ,包括配置、发送和接收消息的基本流程,并介绍如何通过 两种方式定义交换机(Exchange)与队列(Queue):一种是http://www.chinasem.cn在生产者端手动声明,另一种是在消费者端通过注解自动绑定。

准备工作

1. 安装 RabbitMQ

可以通过 docker 快速安装 RabbitMQ:

docker run -d --hostname my-rabbit --name rabbitmq \
  -p 5672:5672 -p 15672:15672 \
  rabbitmq:3-management
  • 5672:AMQP 协议端口
  • 15672:RabbitMQ 管理界面端口

访问管理界面:http://localhost:15672
默认账号密码:guest / guest

2. 消息发送者(Producer)配置

1. 创建 Spring Boot 项目

使用 Spring Initializr 或 IDE 的新建项目向导来创建一个新的 Spring Boot 项目,确保添加以下依赖:

  • Spring Web
  • Spring AMQP

2. 配置 RabbitMQ 连接信息

application.yml 中配置 RabbitMQ 的连接参数:

spring:
  rabbitmq:
    host: localhost
    port: 5672
    username: guest
    password: guest

3. 编写消息发送逻辑

创建一个简单的 REST 控制器来触发消息发送:

@RestController
@RequestMapping("/api/producer")
public class ProducerController {
    @Autowired
    private AmqpTemplate amqpTemplate;
    @GetMapping("/send")
    public String sendMessage(@RequestParam String message) {
        amqpTemplate.convertAndSend("my.queue", message);
        return "Message sent: " + message;
    }
}

注意:这种方式适用于直接发送到队列的情况,但在实际项目中我们通常会通过 Exchange 来路由消息。

3. 使用 Exchange 的两种方式

在 RabbitMQ 中,消息的流向是:Producer → Exchange → Queue → Consumer。因此,定义 Exchange 和 Queue 并进行绑定是非常关键的步骤。

下面介绍两种常见的定义方式:

方式一:在生产者端手动声明 Exchange、Queue 和 Binding

示例:Direct Exchange

1. 配置类定义 Exchange、Queue 及其绑定关系

@Configuration
public class RabbitMQConfig {
    @Bean
    public DirectExchange myDirectExchange() {
        return new DirectExchange("my.direct.exchange");
    }
    @Bean
    public Queue myDirectQueue() {
        return new Queue("my.direct.queue");
    }
    @Bean
    public Binding bindingDirectQueueToExchange(Queue myDirectQueue, DirectExchange China编程myDirectExchange) {
UFsGFnv        return BindingBuilderSupport.bind(myDirectQueue).to(myDirectExchange).with("direct.key").noargs();
    }
}

2. 发送消息时指定 Exchange 和 Routing Key

amqpTemplate.convertAndSend("my.direct.exchange", "direct.key", message);

这种方式适合需要精细控制队列和交换机的场景,如多服务协同、复杂路由等。

方式二:在消费者端通过注解自动声明 Exchange、Queue 并绑定

Spring 提供了强大的注解功能,可以在消费者监听方法上直接声明 Exchange、Queue 和绑定关系,无需额外的配置类。

示例:使用 @RabbitListener 注解绑定

@Component
public class ConsumerListener {
    @RabbitListener(bindings = @QueueBinding(
        value = @Queue(value = "my.annotation.queue", durable = "true"),
        exchange = @Exchange(value = "my.annotation.exchange", type = "direct", durable = "true"),
        key = "annotation.key"
    ))
    public void receive(String message) {
        System.out.println("【消费者】收到消息:" + message);
    }
}

优点:开发更高效,特别适合快速搭建原型或小型项目。

注意事项

  • 此方式只在消费者端有效;
  • 如果已有 Exchange 或 Queue 与注解配置不一致,可能会抛出异常;
  • 建议设置 durable = "true" 实现持久化。

4. 消息消费者(Consumer)配置

1. 创建 Spring Boot 项目

同样地,创建一个新的 Spring Boot 项目,这次只需要添加 Spring AMQP 依赖。

2. 配置 RabbitMQ 连接信息

与生产者的配置相同,在 application.yml 中配置 RabbitMQ 的连接参数。

3. 创建队列并编写China编程消息接收逻辑

方法一:手动定义队列(推荐用于简单场景)

@Configuration
public class RabbitMQConfig {
    @Bean
    public Queue myQueue() {
        return new Queue("my.queue");
   www.chinasem.cn }
}

方法二:使用 @RabbitListener 自动绑定(详见上文)

消息监听器

@Component
public class ConsumerListener {
    @RabbitListener(queues = "my.queue")
    public void receive(String message) {
        System.out.println("Received message: " + message);
    }
}

注意事项

  • 队列名称一致性:确保生产者和消费者的队列名称一致,这样它们才能正确通信。
  • 网络连通性:如果生产者和消费者运行在不同的机器上,请确保这些机器之间能够通过网络访问 RabbitMQ 服务器,并根据需要调整主机名或 IP 地址。
  • 并发处理:考虑在消费者端配置并发消费者以提高消息处理效率。
  • 幂等性与容错机制:建议开启确认机制(ACK/NACK),避免消息丢失或重复消费。

总结

通过以上步骤,我们就可以拥有两个独立的 Spring Boot 应用程序:一个用于发送消息,另一个用于消费消息。这种方式非常适合构建基于消息队列的分布式系统。

同时,也了解了两种定义 Exchange、Queue 及其绑定关系 的方式:

方式适用场景特点
生产者手动声明多服务协作、复杂路由控制精细,结构清晰
消费者注解绑定快速开发、轻量级项目开发效率高,但仅限于消费者端

到此这篇关于在Spring Boot中集成RabbitMQ的完整指南的文章就介绍到这了,更多相关Spring Boot集成RabbitMQ内容请搜索China编程(www.chinasem.cn)以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程China编程(www.chinasem.cn)!

这篇关于在Spring Boot中集成RabbitMQ的实战记录的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1155219

相关文章

一篇文章彻底搞懂macOS如何决定java环境

《一篇文章彻底搞懂macOS如何决定java环境》MacOS作为一个功能强大的操作系统,为开发者提供了丰富的开发工具和框架,下面:本文主要介绍macOS如何决定java环境的相关资料,文中通过代码... 目录方法一:使用 which命令方法二:使用 Java_home工具(Apple 官方推荐)那问题来了,

Java HashMap的底层实现原理深度解析

《JavaHashMap的底层实现原理深度解析》HashMap基于数组+链表+红黑树结构,通过哈希算法和扩容机制优化性能,负载因子与树化阈值平衡效率,是Java开发必备的高效数据结构,本文给大家介绍... 目录一、概述:HashMap的宏观结构二、核心数据结构解析1. 数组(桶数组)2. 链表节点(Node

Java AOP面向切面编程的概念和实现方式

《JavaAOP面向切面编程的概念和实现方式》AOP是面向切面编程,通过动态代理将横切关注点(如日志、事务)与核心业务逻辑分离,提升代码复用性和可维护性,本文给大家介绍JavaAOP面向切面编程的概... 目录一、AOP 是什么?二、AOP 的核心概念与实现方式核心概念实现方式三、Spring AOP 的关

详解SpringBoot+Ehcache使用示例

《详解SpringBoot+Ehcache使用示例》本文介绍了SpringBoot中配置Ehcache、自定义get/set方式,并实际使用缓存的过程,文中通过示例代码介绍的非常详细,对大家的学习或者... 目录摘要概念内存与磁盘持久化存储:配置灵活性:编码示例引入依赖:配置ehcache.XML文件:配置

Java 虚拟线程的创建与使用深度解析

《Java虚拟线程的创建与使用深度解析》虚拟线程是Java19中以预览特性形式引入,Java21起正式发布的轻量级线程,本文给大家介绍Java虚拟线程的创建与使用,感兴趣的朋友一起看看吧... 目录一、虚拟线程简介1.1 什么是虚拟线程?1.2 为什么需要虚拟线程?二、虚拟线程与平台线程对比代码对比示例:三

Python版本信息获取方法详解与实战

《Python版本信息获取方法详解与实战》在Python开发中,获取Python版本号是调试、兼容性检查和版本控制的重要基础操作,本文详细介绍了如何使用sys和platform模块获取Python的主... 目录1. python版本号获取基础2. 使用sys模块获取版本信息2.1 sys模块概述2.1.1

Java中的.close()举例详解

《Java中的.close()举例详解》.close()方法只适用于通过window.open()打开的弹出窗口,对于浏览器的主窗口,如果没有得到用户允许是不能关闭的,:本文主要介绍Java中的.... 目录当你遇到以下三种情况时,一定要记得使用 .close():用法作用举例如何判断代码中的 input

Spring Gateway动态路由实现方案

《SpringGateway动态路由实现方案》本文主要介绍了SpringGateway动态路由实现方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随... 目录前沿何为路由RouteDefinitionRouteLocator工作流程动态路由实现尾巴前沿S

JavaScript对象转数组的三种方法实现

《JavaScript对象转数组的三种方法实现》本文介绍了在JavaScript中将对象转换为数组的三种实用方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友... 目录方法1:使用Object.keys()和Array.map()方法2:使用Object.entr

idea+spring boot创建项目的搭建全过程

《idea+springboot创建项目的搭建全过程》SpringBoot是Spring社区发布的一个开源项目,旨在帮助开发者快速并且更简单的构建项目,:本文主要介绍idea+springb... 目录一.idea四种搭建方式1.Javaidea命名规范2JavaWebTomcat的安装一.明确tomcat