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: localhostport: 5672username: guestpassword: 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 {// 定义队列@Beanpublic Queue myQueue() {return new Queue("myQueue", true); // 第二个参数表示是否持久化}// 定义交换机@Beanpublic DirectExchange myExchange() {return new DirectExchange("myExchange", true, false);}// 绑定队列和交换机@Beanpublic 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 {@Autowiredprivate 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);} }
在这个例子中,通过
Channel
的basicAck
方法手动确认消息。如果消息处理失败,可以调用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 的基本操作,实现消息的发送和接收。