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 的基础集成,并具备在生产环境中监控和解决常见问题的能力。



相关推荐
paopaokaka_luck15 小时前
基于springboot3+vue3的智能文库平台(AI智能搜索、AI智能汇总、实时在线状态展示、多格式文档预览与富文本编辑、Echarts图形化分析)
前端·网络·spring boot·网络协议·echarts
zzzll111116 小时前
Spring Boot 入门指南:从零开始构建 Java Web 应用
java·前端·spring boot
热心市民lcj21 小时前
Spring Boot 整合 Caffeine 本地缓存实战
spring boot·后端·缓存
笨蛋不要掉眼泪21 小时前
RabbitMQ消息队列:SpringAMQP
java·分布式·rabbitmq
天丁o1 天前
Spring Boot + MyBatis Plus 考勤日报统计报表:打卡记录聚合、异常分类和明细下钻 Demo
spring boot·mybatis plus·企业数字化·考勤系统·报表统计
智_永无止境1 天前
Spring Boot 集成 OnlyOffice
java·spring boot·后端
Devin~Y1 天前
从本地生活电商到 AI RAG:互联网大厂 Java 面试场景完整实战
java·spring boot·redis·elasticsearch·spring cloud·kafka·rag
米码收割机1 天前
SA508-3钢回火焊道焊接温度场数值模拟(模拟图+论文)
spring boot·express·宠物
笨蛋不要掉眼泪1 天前
RabbitMQ消息队列:交换机机制
java·分布式·rabbitmq
米码收割机1 天前
【项目】spring boot+vue3 宠物领养系统(源码+文档)【独一无二】
java·spring boot·宠物