开发者

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

目录
  • 前言
  • 准备工作
  • 1. 安装 RabbitMQ
  • 2. 消息发送者(Producer)配置
    • 1. 创建 Spring Boot 项目
    • 2. 配置 RabbitMQ 连接信息
    • 3. 编写消息发送逻辑
  • 3. 使用 Exchange 的两种方式
    • 方式一:在生产者端手动声明 Exchange、Queue 和 Binding
    • 方式二:在消费者端通过注解自动声明 Exchange、Queue 并绑定
  • 4. 消息消费者(Consumer)配置
    • 1. 创建 Spring Boot 项目
    • 2. 配置 RabbitMQ 连接信息
    • 3. 创建队列并编写消息接收逻辑
  • 注意事项
    • 总结

      前言

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

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

      准备工作

      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 编程客栈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. 创建队列并编写编程客栈消息接收逻辑

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

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

      方法二:使用 @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内容请搜索编程客栈(www.devze.com)以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程客栈(www.devze.com)!

      0

      上一篇:

      下一篇:

      精彩评论

      暂无评论...
      验证码 换一张
      取 消

      最新开发

      开发排行榜