Spring Boot 整合 RabbitMQ从入门到实战步骤

 更新时间:2026年01月05日 10:12:57   作者:無欲無为  
本文详细介绍了如何在SpringBoot项目中整合RabbitMQ,涵盖基础配置、消息发送与接收、高级特性如手动确认和死信队列,以及性能调优建议,通过实践步骤,读者可以构建一个高可靠、高性能的分布式系统,感兴趣的朋友跟随小编一起看看吧

在分布式系统开发中,消息队列是解耦服务、提升可靠性的关键组件。RabbitMQ 作为业界广泛使用的消息中间件,与 Spring Boot 的整合能显著提升开发效率。本文将手把手教你完成 Spring Boot 与 RabbitMQ 的整合,涵盖基础配置、消息发送与接收,以及高级特性如手动确认和消息确认机制。

1.环境准备

确保已安装 JDK 1.8+、Maven 3.0+ 和 RabbitMQ 服务。RabbitMQ 可通过 Docker 快速启动:

docker run -d --name rabbitmq -p 5672:5672 -p 15672:15672 rabbitmq:management

2.创建 Spring Boot 项目

使用 Spring Initializr 创建项目,添加以下依赖:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-amqp</artifactId>
</dependency>

3.配置 RabbitMQ 连接

src/main/resources/application.yml中配置连接参数:

spring:
  rabbitmq:
    host: localhost       # RabbitMQ 服务器地址
    port: 5672           # 默认端口
    username: guest      # 默认用户名
    password: guest      # 默认密码
    virtual-host: /      # 虚拟主机(默认)
    publisher-confirm-type: correlated  # 开启消息确认
    publisher-returns: true             # 开启消息失败回调
    listener:
      simple:
        acknowledge-mode: manual       # 手动确认消息
        prefetch: 1                    # 每次预取的消息数

4.声明队列和交换机

创建配置类定义队列、交换机及绑定关系:

@Configuration
public class RabbitConfig {
    // 直连交换机
    public static final String DIRECT_EXCHANGE = "direct_exchange";
    // 队列
    public static final String DIRECT_QUEUE = "direct_queue";
    // 路由键
    public static final String ROUTING_KEY = "routing_key";
    @Bean
    public Exchange directExchange() {
        return ExchangeBuilder.directExchange(DIRECT_EXCHANGE).build();
    }
    @Bean
    public Queue directQueue() {
        return new Queue(DIRECT_QUEUE, true); // durable=true 表示持久化
    }
    @Bean
    public Binding binding(Queue queue, Exchange exchange) {
        return BindingBuilder.bind(queue).to(exchange).with(ROUTING_KEY);
    }
}

5.生产者(发送消息)

创建 RabbitProducer.java 注入 RabbitTemplate 发送消息:

@Service
public class RabbitProducer {
    @Autowired
    private RabbitTemplate rabbitTemplate;
    public void sendMessage(String message) {
        rabbitTemplate.convertAndSend(
            RabbitConfig.DIRECT_EXCHANGE, 
            RabbitConfig.ROUTING_KEY, 
            message
        );
    }
}

6.消费者(接收消息)

创建 RabbitConsumer.java 监听队列:

@Service
public class RabbitConsumer {
    @RabbitListener(queues = RabbitConfig.DIRECT_QUEUE)
    public void receiveMessage(String message) {
        System.out.println("收到消息: " + message);
        // 手动确认消息(需配置 acknowledge-mode: manual)
        // 实际项目中需处理异常和重试逻辑
    }
}

7.消息确认机制

生产者确认 

在 application.yml 中已配置 publisher-confirm-type: correlated,可通过回调确认消息是否成功到达交换机:

@Bean
public RabbitTemplate rabbitTemplate(ConnectionFactory connectionFactory) {
    RabbitTemplate template = new RabbitTemplate(connectionFactory);
    template.setConfirmCallback((correlationData, ack, cause) -> {
        if (ack) {
            System.out.println("消息确认成功");
        } else {
            System.err.println("消息确认失败: " + cause);
        }
    });
    template.setMandatory(true); // 开启强制回调
    return template;
}

消费者确认:配置 acknowledge-mode: manual 后,需在消费者中手动确认:

@RabbitListener(queues = RabbitConfig.DIRECT_QUEUE)
public void receiveMessage(String message, Channel channel, @Header(AmqpHeaders.DELIVERY_TAG) long deliveryTag) {
    try {
        System.out.println("处理消息: " + message);
        channel.basicAck(deliveryTag, false); // 确认消息
    } catch (Exception e) {
        channel.basicNack(deliveryTag, false, true); // 拒绝消息并重新入队
    }
}

8.死信队列配置

处理无法被消费的消息,创建死信队列并绑定:

@Bean
public Queue deadLetterQueue() {
    Map<String, Object> args = new HashMap<>();
    args.put("x-dead-letter-exchange", "dlx_exchange"); // 指定死信交换机
    args.put("x-dead-letter-routing-key", "dlx_routing_key");
    return new Queue("dlx_queue", true, false, false, args);
}

9.测试与验证

确保 RabbitMQ 服务已启动(默认端口 15672 为管理界面)。

创建 RabbitMQApplicationTests.java

@SpringBootTest
@AutoConfigureMockMvc
public class RabbitMQApplicationTests {
    @Autowired
    private RabbitProducer producer;
    @Test
    public void testSendMessage() {
        producer.sendMessage("Hello RabbitMQ!");
    }
}

10.常见问题与解决方案

连接失败‌:检查 host 和 port 是否正确,确保 RabbitMQ 服务已启动。
消息未消费‌:确认消费者监听的是正确的队列,检查 acknowledge-mode 配置。
性能调优‌:调整 prefetch-count 和 concurrency 参数优化吞吐量。

11.总结

本文从零开始实现了 Spring Boot 与 RabbitMQ 的整合,涵盖基础配置、消息发送与接收、高级特性(如手动确认和死信队列)。通过合理使用这些特性,可以构建高可靠、高性能的分布式系统。如需进一步学习,可参考 RabbitMQ 官方文档。

到此这篇关于Spring Boot 整合 RabbitMQ从入门到实战步骤的文章就介绍到这了,更多相关Spring Boot 整合 RabbitMQ内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Token登陆验证机制的原理及实现

    Token登陆验证机制的原理及实现

    这篇文章介绍了Token登陆验证机制的原理及实现,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-12-12
  • Java 改造ayui表格组件实现多重排序

    Java 改造ayui表格组件实现多重排序

    layui 的表格组件目前只支持单列排序,在实际应用中并不能很好的支撑我们的业务需求。今天一时手痒,决定改造一番以支持多重排序。
    2021-04-04
  • 宁可用Lombok也不把成员设置为public原理解析

    宁可用Lombok也不把成员设置为public原理解析

    这篇文章主要为大家介绍了宁可用Lombok也不把成员设置为public原理解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-03-03
  • 浅析MMAP零拷贝在RocketMQ中的运用

    浅析MMAP零拷贝在RocketMQ中的运用

    零拷贝技术可以减少数据拷贝和共享总线操作的次数,消除传输数据在存储器之间不必要的中间拷贝次数,从而有效地提高数据传输效率,这篇文章主要介绍了MMAP零拷贝在RocketMQ中的运用,需要的朋友可以参考下
    2022-07-07
  • java/word+fusionchart生成图表深入分析

    java/word+fusionchart生成图表深入分析

    本文将以java/word+fusionchart生成图表问题深入解析,有兴趣的朋友可以参考下
    2012-11-11
  • Springboot整合Java DL4J实现交通标志识别系统全过程

    Springboot整合Java DL4J实现交通标志识别系统全过程

    在自动驾驶系统中,交通标志识别是实现车辆智能化的关键技术之一,本文介绍了利用SpringBoot和JavaDeeplearning4j构建交通标志识别系统的方法,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2024-10-10
  • JAVA中String介绍及常见面试题小结

    JAVA中String介绍及常见面试题小结

    这篇文章主要介绍了JAVA中String介绍及常见面试题,在java面试中经常会被面试官问到,小编通过实例代码相结合给大家详细介绍,需要的朋友可以参考下
    2020-02-02
  • Java把list分成多个list的方法示例

    Java把list分成多个list的方法示例

    在编程中将大的list集合拆分为多个小集合可以提高处理效率,主要拆分方法包括等量拆分适用于均匀处理数据、 指定数量拆分按固定子集大小划分、根据条件拆分按特定规则进行,这些方法有助于多线程异步处理,需要的朋友可以参考下
    2024-11-11
  • 解决在Idea 2020.2下使用 Lombok的注解不生效的问题(插件安装了,依赖也写了,自动注解也设置了)

    解决在Idea 2020.2下使用 Lombok的注解不生效的问题(插件安装了,依赖也写了,自动注解也设置了)

    这篇文章主要介绍了在Idea 2020.2下使用 Lombok的注解不生效的问题(插件安装了,依赖也写了,自动注解也设置了),本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-08-08
  • JDK10新特性之var泛型和多个接口实现方法

    JDK10新特性之var泛型和多个接口实现方法

    这篇文章主要介绍了JDK10的新特性:var泛型和多个接口实现方法,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-05-05

最新评论