Spring Boot集成RabbitMQ高级篇:可靠性与性能提升

一、环境准备

  1. 安装 RabbitMQ

    • 在官网上下载对应操作系统的安装包(如 Windows、Linux 等),按照安装向导完成安装。

    • 安装完成后,启动 RabbitMQ 服务。在 Windows 系统下,可以在服务列表中找到 RabbitMQ Server 并启动;在 Linux 系统下,可以通过命令行启动,例如使用 systemctl start rabbitmq-server(具体命令可能因 Linux 发行版而异)。

    • 默认情况下,RabbitMQ 使用 5672 端口进行通信。可以通过浏览器访问 http://localhost:15672(默认用户名和密码是 guest/guest)来访问 RabbitMQ 的管理界面,查看队列、交换机等信息。

  2. 添加 Spring Boot 依赖

    • 在 Spring Boot 项目的 pom.xml 文件中添加 RabbitMQ 相关依赖。例如:

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

      这个依赖会自动引入 RabbitMQ 的客户端库以及 Spring AMQP(高级消息队列协议)相关的模块,方便我们在 Spring Boot 中操作 RabbitMQ。

二、配置 RabbitMQ

  1. 在 application.properties 或 application.yml 文件中配置

    • application.properties 示

      XML 复制代码
      spring.rabbitmq.host=localhost
      spring.rabbitmq.port=5672
      spring.rabbitmq.username=guest
      spring.rabbitmq.password=guest

      这里配置了 RabbitMQ 服务器的地址、端口以及登录的用户名和密码。如果 RabbitMQ 服务器部署在其他机器上,需要将 localhost 替换为对应的 IP 地址。

    • application.yml 示例

      XML 复制代码
      spring:
        rabbitmq:
          host: localhost
          port: 5672
          username: guest
          password: guest
  2. 高级配置(可选)

    • 连接池配置 如果应用需要频繁地与 RabbitMQ 交互,可以通过配置连接池来提高性能。例如

      复制代码
      spring.rabbitmq.listener.simple.concurrency=3
      spring.rabbitmq.listener.simple.max-concurrency=10

      这里设置了消费者线程池的最小线程数为 3,最大线程数为 10,可以根据实际业务需求调整这些参数。

    • 消息确认机制配置 为了确保消息可靠地发送到 RabbitMQ 服务器,可以开启消息确认机制

      复制代码
      spring.rabbitmq.publisher-confirms=true

      当消息成功发送到 RabbitMQ 服务器后,服务器会发送确认消息给生产者。

三、生产者代码实现

  1. 创建 RabbitMQ 配置类(可选)

    • 如果需要自定义一些 RabbitMQ 的配置,如交换机、队列等,可以创建一个配置类。例如

      java 复制代码
      import org.springframework.amqp.core.*;
      import org.springframework.context.annotation.Bean;
      import org.springframework.context.annotation.Configuration;
      
      @Configuration
      public class RabbitMQConfig {
          // 定义队列
          @Bean
          public Queue myQueue() {
              return new Queue("myQueue", true); // 第二个参数表示是否持久化
          }
      
          // 定义交换机
          @Bean
          public DirectExchange myExchange() {
              return new DirectExchange("myExchange", true, false);
          }
      
          // 绑定队列和交换机
          @Bean
          public Binding myBinding() {
              return BindingBuilder.bind(myQueue()).to(myExchange()).with("myRoutingKey");
          }
      }

      在这个例子中,定义了一个名为 myQueue 的队列、一个名为 myExchange 的直连交换机(DirectExchange),并通过路由键 myRoutingKey 将队列绑定到交换机。

  2. 创建生产者类

    • 使用 RabbitTemplate 来发送消息。例如:

      java 复制代码
      import org.springframework.amqp.rabbit.core.RabbitTemplate;
      import org.springframework.beans.factory.annotation.Autowired;
      import org.springframework.stereotype.Component;
      
      @Component
      public class RabbitMQProducer {
          @Autowired
          private RabbitTemplate rabbitTemplate;
      
          public void sendMessage(String message) {
              rabbitTemplate.convertAndSend("myExchange", "myRoutingKey", message);
          }
      }

      在这个例子中,通过调用 sendMessage 方法,将消息发送到名为 myExchange 的交换机,并指定路由键为 myRoutingKey。RabbitMQ 会根据路由键将消息路由到对应的队列。

四、消费者代码实现

  1. 创建消费者类

    • 使用 @RabbitListener 注解来监听队列中的消息。例如:

      java 复制代码
      import org.springframework.amqp.rabbit.annotation.RabbitListener;
      import org.springframework.stereotype.Component;
      
      @Component
      public class RabbitMQConsumer {
          @RabbitListener(queues = "myQueue")
          public void receiveMessage(String message) {
              System.out.println("Received message: " + message);
          }
      }

      在这个例子中,RabbitListener 注解指定了要监听的队列名为 myQueue。当有消息到达该队列时,receiveMessage 方法会被调用,并打印接收到的消息。

  2. 手动确认消息(可选)

    • 默认情况下,Spring Boot 使用自动确认模式,即消费者接收到消息后,RabbitMQ 会自动认为消息已被成功处理。如果需要手动确认消息,可以在配置类中设置:

      复制代码
      spring.rabbitmq.listener.simple.acknowledge-mode=manual

      然后在消费者代码中,通过 Channel 手动确认消息:

      java 复制代码
      import org.springframework.amqp.rabbit.annotation.RabbitListener;
      import org.springframework.amqp.rabbit.core.RabbitTemplate;
      import org.springframework.stereotype.Component;
      import com.rabbitmq.client.Channel;
      
      @Component
      public class RabbitMQConsumer {
          @RabbitListener(queues = "myQueue")
          public void receiveMessage(String message, Channel channel, @Header(AmqpHeaders.DELIVERY_TAG) long tag) throws Exception {
              System.out.println("Received message: " + message);
              // 手动确认消息
              channel.basicAck(tag, false);
          }
      }

      在这个例子中,通过 ChannelbasicAck 方法手动确认消息。如果消息处理失败,可以调用 basicNack 方法拒绝消息。

五、测试

  1. 启动项目

    • 启动 Spring Boot 项目,确保 RabbitMQ 服务也在运行。
  2. 发送消息

    • 在代码中调用生产者类的 sendMessage 方法,发送一条消息。例如:

      java 复制代码
      @SpringBootApplication
      public class RabbitMQApplication {
          public static void main(String[] args) {
              ConfigurableApplicationContext context = SpringApplication.run(RabbitMQApplication.class, args);
              RabbitMQProducer producer = context.getBean(RabbitMQProducer.class);
              producer.sendMessage("Hello, RabbitMQ!");
          }
      }
  3. 查看消费者输出

    • 观察消费者类的控制台输出,确认是否成功接收到消息。如果一切正常,应该能看到类似以下的输出:

      Received message: Hello, RabbitMQ!

通过以上步骤,就可以完成 Spring Boot 整合 RabbitMQ 的基本操作,实现消息的发送和接收。

相关推荐
橙露1 小时前
SpringBoot 整合 MinIO:分布式文件存储上传下载
spring boot·分布式·后端
小眼哥2 小时前
SpringBoot整合Vue代码生成exe运行程序以及windows安装包
vue.js·windows·spring boot
shark22222225 小时前
能懂!基于Springboot的用户增删查改(三层设计模式)
spring boot·后端·设计模式
IGAn CTOU5 小时前
王炸级更新!Spring Boot 3.4 正式发布,新特性真香!
java·spring boot·后端
Ssan PRIN6 小时前
深度掌握 RabbitMQ 消息确认(ACK)机制,确保消息万无一失
分布式·rabbitmq
indexsunny7 小时前
互联网大厂Java面试实战:核心技术与微服务架构在电商场景中的应用
java·spring boot·redis·kafka·maven·spring security·microservices
海兰8 小时前
【第3篇-续】多模型多模态项目实现示例(增加OpenAI通用适配)附源代码
java·人工智能·spring boot·alibaba·spring ai
SarL EMEN9 小时前
海康威视摄像头ISUP(原EHOME协议) 摄像头实时预览springboot 版本java实现,并可以在浏览器vue前端播放(附带源码)
java·前端·spring boot
ccice019 小时前
全面掌握Spring Boot + MyBatis + Maven + MySQL:从开发到部署的后端技术详解
spring boot·maven·mybatis
QQ227923910210 小时前
Java springboot基于微信小程序的智慧旅游导游系统景点门票酒店预订(源码+文档+运行视频+讲解视频)
java·spring boot·微信小程序·maven·vuejs