Spring Boot集成RabbitMQ可以实现系统间的异步通信和解耦,通过AmqpTemplate发送消息、@RabbitListener接收消息是常用的实现方式,下面介绍完整的集成步骤和代码实现。

一、环境准备与依赖引入
首先确保本地已经安装并启动了RabbitMQ服务,默认端口为5672,管理界面端口为15672。然后在Spring Boot项目的pom.xml中添加RabbitMQ相关依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
二、RabbitMQ基础配置
在application.yml或application.properties中配置RabbitMQ的连接信息,以下是yml格式的示例:
spring:
rabbitmq:
host: 127.0.0.1
port: 5672
username: guest
password: guest
virtual-host: /
如果需要自定义队列、交换机和绑定关系,可以创建配置类进行定义:
import org.springframework.amqp.core.*;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class RabbitConfig {
// 定义队列
@Bean
public Queue testQueue() {
// 队列名称为test_queue,持久化、非排他、不自动删除
return new Queue("test_queue", true, false, false);
}
// 定义直连交换机
@Bean
public DirectExchange testExchange() {
return new DirectExchange("test_exchange", true, false);
}
// 绑定队列和交换机,指定路由键为test_routing
@Bean
public Binding bindingTest() {
return BindingBuilder.bind(testQueue()).to(testExchange()).with("test_routing");
}
}
三、使用AmqpTemplate发送消息
Spring Boot自动配置了AmqpTemplate实例,我们可以直接注入使用,发送消息到指定交换机和路由键:
import org.springframework.amqp.rabbit.core.AmqpTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@Component
public class MessageSender {
@Autowired
private AmqpTemplate amqpTemplate;
public void sendMessage(String content) {
// 发送消息到交换机test_exchange,路由键为test_routing
amqpTemplate.convertAndSend("test_exchange", "test_routing", content);
System.out.println("消息发送成功:" + content);
}
}
如果需要发送对象类型的消息,只需要保证对象可序列化即可,AmqpTemplate会自动进行序列化处理:
import java.io.Serializable;
public class UserMessage implements Serializable {
private String userId;
private String userName;
private String content;
// 省略getter、setter和构造方法
}
// 发送对象消息的方法
public void sendUserMessage(UserMessage userMessage) {
amqpTemplate.convertAndSend("test_exchange", "test_routing", userMessage);
}
四、使用@RabbitListener接收消息
通过@RabbitListener注解可以监听指定队列的消息,当有消息到达队列时会自动触发方法执行:
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;
@Component
public class MessageReceiver {
// 监听队列test_queue,接收到消息后执行方法
@RabbitListener(queues = "test_queue")
public void receiveMessage(String content) {
System.out.println("接收到字符串消息:" + content);
}
// 监听队列并接收对象类型消息
@RabbitListener(queues = "test_queue")
public void receiveUserMessage(UserMessage userMessage) {
System.out.println("接收到用户消息,用户ID:" + userMessage.getUserId() + ",内容:" + userMessage.getContent());
}
}
五、测试验证
我们可以编写一个测试类验证消息发送和接收功能是否正常:
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
public class RabbitMQTest {
@Autowired
private MessageSender messageSender;
@Test
public void testSendMessage() {
messageSender.sendMessage("这是一条测试消息");
// 等待消息接收,避免测试线程提前结束
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
六、注意事项
- 队列、交换机和绑定关系建议提前在配置类中定义,避免消息发送时队列不存在导致消息丢失
- 如果发送对象消息,要确保对象所在的包路径在发送端和接收端一致,否则会出现反序列化失败的问题
- 生产环境建议开启消息确认机制和手动ACK,保证消息的可靠投递
- @RabbitListener注解的方法如果抛出异常,消息会被重新放回队列,需要注意异常处理的逻辑
消息队列的使用可以有效提升系统的扩展性和稳定性,合理设计队列和路由规则能够满足不同业务场景的通信需求。
Spring_BootRabbitMQAmqpTemplate@RabbitListener消息队列修改时间:2026-07-13 11:09:28