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



相关推荐
哆啦A梦158811 小时前
20, Springboot3+vue3实现前台轮播图和详情页的设计
javascript·数据库·spring boot·mybatis·vue3
伏加特遇上西柚14 小时前
Loki+Alloy+Grafana日志采集部署
java·linux·服务器·spring boot·grafana·prometheus
庞轩px15 小时前
第四篇:SpringBoot自动配置——约定大于配置的底层原理
java·spring boot·后端·spring·自动配置·注解开发
桃花键神17 小时前
【2026精品项目】基于SpringBoot3+Vue3的旧物置换系统(包含源码+项目文档+SQL脚本+部署教程)
数据库·spring boot·sql·vue
阿明在折腾19 小时前
Spring Boot + Python 混合架构:在线工具平台的后端设计
spring boot
Devin~Y20 小时前
大厂Java面试实战:Spring Boot/Cloud、Redis/Kafka、JVM调优与Spring AI RAG(内容社区UGC+AIGC客服场景)
java·jvm·spring boot·redis·spring cloud·kafka·mybatis
秋921 小时前
springboot项目中使用mysql8.0.46版本,具体如何配置及常见问题解决方法
spring boot·mysql8.0.46
逆境不可逃21 小时前
黑马 RabbitMq 基础篇 学习记录
学习·rabbitmq·ruby
倒流时光三十年1 天前
第1篇:你真的了解 Kafka 吗?—— 破冰篇
spring boot·分布式·kafka·linq
她说可以呀1 天前
JWT令牌检验用户是否登录
java·spring boot·spring·java-ee·maven