12. 消息队列-RabbitMQ-Spring Boot 集成 RabbitMQ

文章目录

  • 前言
  • [一、 RabbitMQ 消息队列配置](#一、 RabbitMQ 消息队列配置)
    • [1. 创建交换机](#1. 创建交换机)
    • [2. 创建队列](#2. 创建队列)
    • [## 3. 绑定](## 3. 绑定)
  • [二、构建Spring Boot项目](#二、构建Spring Boot项目)
    • [1. 添加依赖](#1. 添加依赖)
    • [2. 配置连接](#2. 配置连接)
    • [3. 声明交换机、队列和绑定](#3. 声明交换机、队列和绑定)
    • [4. 消息的发送与接收](#4. 消息的发送与接收)
  • [三、🛠️ 监控与问题排查技巧](#三、🛠️ 监控与问题排查技巧)
    • [1. 核心监控手段](#1. 核心监控手段)
    • [2. 常见问题与解决方案](#2. 常见问题与解决方案)

前言

🚀Spring Boot 集成

集成过程主要分为添加依赖、配置连接、声明组件和收发消息四个步骤。


一、 RabbitMQ 消息队列配置

1. 创建交换机

2. 创建队列

## 3. 绑定

  1. 点击要绑定队列的交换机,进入交换机详情页面
  1. 在绑定信息区域,向交换机添加绑定信息。

输入要绑定的队列名称,绑定键,以及必要的参数,点击Bind。

二、构建Spring Boot项目

1. 添加依赖

pom.xml 文件中,添加 spring-boot-starter-amqp 依赖,它将自动引入所有必要的库。

xml 复制代码
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-amqp</artifactId>
</dependency>

2. 配置连接

application.yml 中配置 RabbitMQ 的连接信息。建议开启心跳和连接重试,以保证连接的稳定性。

yaml 复制代码
spring:
  rabbitmq:
    host: 127.0.0.1
    port: 5672
    username: guest
    password: guest
    # 开启心跳检测,防止连接因长时间空闲而断开
    requested-heartbeat: 60
    listener:
      simple:
        retry:
          enabled: true # 开启连接重试
          max-attempts: 3

3. 声明交换机、队列和绑定

通过 Java 配置类来声明 RabbitMQ 的核心组件。这确保了应用启动时,所需的队列和交换机就已存在。

java 复制代码
import org.springframework.amqp.core.*;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class RabbitMQConfig {

    // 声明一个名为 "test.queue" 的持久化队列
    @Bean
    public Queue testQueue() {
        return new Queue("test.queue", true);
    }

    // 声明一个名为 "test.direct" 的持久化直连交换机
    @Bean
    public DirectExchange testExchange() {
        return new DirectExchange("test.direct", true, false);
    }

    // 将队列绑定到交换机,并指定路由键
    @Bean
    public Binding binding(Queue testQueue, DirectExchange testExchange) {
        return BindingBuilder.bind(testQueue).to(testExchange).with("test.routingKey");
    }
}

4. 消息的发送与接收

使用 RabbitTemplate 发送消息,@RabbitListener 注解接收消息。

  • 生产者 :注入 RabbitTemplate,调用 convertAndSend 方法。

    java 复制代码
    @Autowired
    private RabbitTemplate rabbitTemplate;
    
    public void sendMessage(String message) {
       // 发送消息到指定的交换机和路由键
       rabbitTemplate.convertAndSend("test.direct", "test.routingKey", message);
    }
  • 消费者 :使用 @RabbitListener 监听队列。强烈建议使用手动确认模式(MANUAL),以确保消息被成功处理后再发送ACK,防止消息丢失。

    java 复制代码
    import com.rabbitmq.client.Channel;
    import org.springframework.amqp.rabbit.annotation.RabbitListener;
    import org.springframework.amqp.support.AmqpHeaders;
    import org.springframework.messaging.handler.annotation.Header;
    
    @Component
    public class OrderConsumer {
    
       @RabbitListener(queues = "test.queue", ackMode = "MANUAL")
       public void processMessage(String message, Channel channel, @Header(AmqpHeaders.DELIVERY_TAG) long tag) {
           try {
               // 业务处理逻辑
               System.out.println("收到消息: " + message);
               // 处理成功后,手动确认
               channel.basicAck(tag, false);
           } catch (Exception e) {
               // 处理失败,可以根据情况选择拒绝消息
               // requeue=true 表示消息重新入队,false 则进入死信队列(如果配置了)
               channel.basicNack(tag, false, true);
           }
       }
    }

三、🛠️ 监控与问题排查技巧

当系统投入运行后,有效的监控和问题排查能力至关重要。

1. 核心监控手段

  1. RabbitMQ 管理后台

RabbitMQ 的管理插件,这是最直观的监控工具,它提供了一个 Web UI 来监控和管理 RabbitMQ 服务器。

通过启用 rabbitmq_management 插件,你可以访问 http://<你的服务器IP>:15672 来查看:

  • 概览: 连接数、信道数、队列总数、消息速率等。
  • 队列: 每个队列的消息数量(Ready, Unacked)、消费者数量、内存占用。
  • 连接/信道: 查看当前所有连接和信道的状态。
  • 节点: 监控各个节点的内存、磁盘、文件描述符等资源使用情况。
  1. Prometheus + Grafana

对于生产环境,建议使用 Prometheus 收集指标,并用 Grafana 进行可视化展示和告警。

  • 步骤一:启用 Prometheus 插件。
bash 复制代码
rabbitmq-plugins enable rabbitmq_prometheus
  • 步骤二 :配置 Prometheus (prometheus.yml) 来抓取 RabbitMQ 的指标(默认端口 15692)。

    yaml 复制代码
    scrape_configs:
    - job_name: 'rabbitmq'
      static_configs:
        - targets: ['localhost:15692']
  • 步骤三:在 Grafana 中导入 RabbitMQ 官方或社区提供的仪表盘模板,即可看到丰富的可视化图表。

2. 常见问题与解决方案

问题现象 可能原因 解决方案
消息丢失 生产者未开启确认、消费者自动确认、队列/消息未持久化。 1. 生产者开启 publisher-confirm-type: correlated 2. 消费者使用 ackMode: MANUAL 3. 队列和消息都设置为持久化。
消息重复消费 消费者处理成功后,发送ACK前Broker宕机,导致消息重新投递。 实现业务幂等性。例如,使用消息的唯一ID在Redis中做处理记录,或依赖数据库的唯一索引。
消息堆积 消费者处理能力不足、处理速度慢、或消费者宕机。 1. 优化消费者 :增加消费者实例数量,调整 prefetch 参数(建议5-25)。 2. 队列拆分 :按业务类型或优先级拆分队列,避免单队列瓶颈。 3. 使用惰性队列:将积压消息存入磁盘,降低内存压力。
消费者阻塞 消费者处理逻辑耗时过长,或预取(prefetch)消息数过多。 1. 调小 prefetch 值,避免一个消费者占用过多消息。 2. 消费者内部使用线程池异步处理业务,避免阻塞消费线程。
高CPU/性能慢 频繁创建/销毁连接、大量小消息、磁盘I/O瓶颈。 1. 使用连接池 ,保持长连接。 2. 生产者批量发送 ,减少网络交互次数。 3. 检查磁盘I/O,考虑使用SSD。

通过以上步骤,可以完成 Spring Boot 与 RabbitMQ 的基础集成,并具备在生产环境中监控和解决常见问题的能力。



相关推荐
zhangren024682 小时前
Laravel5.x版本特性全解析
android·vue.js·spring boot·mysql
Meepo_haha2 小时前
ES在SpringBoot集成使用
spring boot·elasticsearch·jenkins
liangblog3 小时前
Spring Boot中手动实例化 `JdbcTemplate` 并指定 数据源
java·spring boot·后端
啥都想学点3 小时前
从 Flutter 前端到 Spring Boot 后端:2026 年技术栈落地路线图(实战版)
前端·spring boot·flutter
jiajia_lisa3 小时前
不止是识别,OCR重新定义文档管理新方式
rabbitmq
七夜zippoe3 小时前
云原生Java应用部署:将Spring Boot应用迁移至Kubernetes完整指南
java·spring boot·docker·云原生·kuberbertes
mygljx6 小时前
SpringBoot+Mybatis-plus实现分页查询(一看就会)
spring boot·mybatis·状态模式
彭于晏Yan14 小时前
Redisson分布式锁
spring boot·redis·分布式
ywf121517 小时前
Spring Boot接收参数的19种方式
java·spring boot·后端