Spring Boot集成RabbitMQ的过程之可靠性与性能提升的问题记录

 更新时间:2025年05月13日 09:14:16   作者:愿你天黑有灯下雨有伞  
这篇文章主要介绍了Spring Boot集成RabbitMQ的过程之可靠性与性能提升的问题记录,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧

一、环境准备

安装 RabbitMQ

  • 在官网上下载对应操作系统的安装包(如 Windows、Linux 等),按照安装向导完成安装。
  • 安装完成后,启动 RabbitMQ 服务。在 Windows 系统下,可以在服务列表中找到 RabbitMQ Server 并启动;在 Linux 系统下,可以通过命令行启动,例如使用 systemctl start rabbitmq-server(具体命令可能因 Linux 发行版而异)。
  • 默认情况下,RabbitMQ 使用 5672 端口进行通信。可以通过浏览器访问 http://localhost:15672(默认用户名和密码是 guest/guest)来访问 RabbitMQ 的管理界面,查看队列、交换机等信息。

添加 Spring Boot 依赖

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

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

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

二、配置 RabbitMQ

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

application.properties 示

spring.rabbitmq.host=localhost
spring.rabbitmq.port=5672
spring.rabbitmq.username=guest
spring.rabbitmq.password=guest

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

application.yml 示例

spring:
  rabbitmq:
    host: localhost
    port: 5672
    username: guest
    password: guest

高级配置(可选)

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

spring.rabbitmq.listener.simple.concurrency=3
spring.rabbitmq.listener.simple.max-concurrency=10

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

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

spring.rabbitmq.publisher-confirms=true

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

三、生产者代码实现

创建 RabbitMQ 配置类(可选)

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

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 将队列绑定到交换机。

创建生产者类

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

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 会根据路由键将消息路由到对应的队列。

四、消费者代码实现

创建消费者类

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

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 方法会被调用,并打印接收到的消息。

手动确认消息(可选)

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

spring.rabbitmq.listener.simple.acknowledge-mode=manual

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

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 方法拒绝消息。

五、测试

启动项目

启动 Spring Boot 项目,确保 RabbitMQ 服务也在运行。

发送消息

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

@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!");
    }
}

查看消费者输出

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

Received message: Hello, RabbitMQ!

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

到此这篇关于Spring Boot集成RabbitMQ的过程之可靠性与性能提升的文章就介绍到这了,更多相关Spring Boot集成RabbitMQ内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • idea项目中target文件提示拒绝访问的解决

    idea项目中target文件提示拒绝访问的解决

    这篇文章主要介绍了idea项目中target文件提示拒绝访问的解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-11-11
  • 学习Java之File文件操作方法

    学习Java之File文件操作方法

    这篇文章我们主要学习如何实现IO流的具体操作,但很多时候,IO流都会操作一个文件,所以我们需要先学习在Java中如何操作文件,包括文件及文件夹的创建、遍历、删除等,有了文件操作的基础,我们才能更好地操作IO流,文中有详细的代码示例,需要的朋友可以参考下
    2023-09-09
  • mybatis和mybatis-plus同时使用的坑

    mybatis和mybatis-plus同时使用的坑

    本文主要介绍了mybatis和mybatis-plus同时使用的坑,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-05-05
  • Java多线程 原子性操作类的使用

    Java多线程 原子性操作类的使用

    这篇文章主要介绍了Java多线程 原子性操作类的使用,在java5以后,我们接触到了线程原子性操作,也就是在修改时我们只需要保证它的那个瞬间是安全的即可,经过相应的包装后可以再处理对象的并发修改,本文总结一下Atomic系列的类的使用方法,下面一起进入文章了解详细内容
    2021-10-10
  • 使用Mybatis接收Integer参数的问题

    使用Mybatis接收Integer参数的问题

    这篇文章主要介绍了使用Mybatis接收Integer参数的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-03-03
  • Flowable执行完毕的流程查找方法

    Flowable执行完毕的流程查找方法

    这篇文章主要为大家介绍了Flowable执行完毕的流程查找方法详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-11-11
  • 详解Java中的final关键字

    详解Java中的final关键字

    子类可以在父类的基础上改写父类内容,为了避免这种随意改写的情况,Java提供了final 关键字,用于修饰不可改变内容。本文就来详细说说final关键字的使用,需要的可以参考一下
    2022-10-10
  • Java经典面试题汇总:Spring

    Java经典面试题汇总:Spring

    本篇总结的是Spring框架相关的面试题,后续会持续更新,希望我的分享可以帮助到正在备战面试的实习生或者已经工作的同行,如果发现错误还望大家多多包涵,不吝赐教,谢谢
    2021-07-07
  • 轻松了解java中Caffeine高性能缓存库

    轻松了解java中Caffeine高性能缓存库

    本文我们将学习了解到用于Java的高性能缓存库Caffeine,其使用Window TinyLfu清理策略,提供最佳的命中率
    2021-08-08
  • java案例实战之字符串转换为二进制

    java案例实战之字符串转换为二进制

    最近遇到个需求,要求编写一个程序,从键盘录入一个字符串,将字符串转换为二进制数,下面这篇文章主要给大家介绍了关于java字符串转换为二进制的相关资料,需要的朋友可以参考下
    2023-06-06

最新评论