一、消息队列能解决什么问题?
- 异步处理:解耦耗时操作(如发短信、日志记录)
- 流量削峰:应对突发请求,避免系统过载
- 应用解耦:服务间通过消息通信,降低依赖
二、快速整合RabbitMQ
1. 环境准备
- 安装RabbitMQ(推荐Docker一键部署):
docker run -d --name rabbitmq -p 5672:5672 -p 15672:15672 rabbitmq:management
- 访问管理界面:
http://localhost:15672
(账号/密码:guest/guest)
2. Spring Boot项目配置
① 添加依赖
<!-- pom.xml -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
② 配置连接信息
# application.yml
spring:
rabbitmq:
host: localhost
port: 5672
username: guest
password: guest
virtual-host: /
三、核心代码实现
1. 生产者(发送消息)
@Component
public class MsgProducer {
@Autowired
private AmqpTemplate amqpTemplate;
// 发送到指定队列
public void send(String message) {
amqpTemplate.convertAndSend("demo_queue", message);
System.out.println("消息已发送: " + message);
}
}
2. 消费者(接收消息)
@Component
public class MsgConsumer {
// 监听指定队列
@RabbitListener(queues = "demo_queue")
public void handle(String message) {
System.out.println("收到消息: " + message);
}
}
3. 自动创建队列(可选)
@Configuration
public class RabbitConfig {
// 声明队列(若不存在则自动创建)
@Bean
public Queue demoQueue() {
return new Queue("demo_queue");
}
}
四、测试消息收发
@SpringBootTest
class DemoApplicationTests {
@Autowired
private MsgProducer msgProducer;
@Test
void testSend() {
msgProducer.send("Hello RabbitMQ!");
}
}
控制台输出:
消息已发送: Hello RabbitMQ!
收到消息: Hello RabbitMQ!
五、扩展:常用注解与配置
注解/配置 | 说明 |
---|---|
@RabbitListener | 监听队列或交换机消息 |
@RabbitHandler | 处理消息的方法注解 |
@Exchange + @Binding | 声明交换机与队列绑定关系 |
spring.rabbitmq.listener.simple.retry.enabled=true | 启用消费失败重试 |
六、常见问题
-
消息未消费
- 检查队列名是否一致
- 消费者是否添加了
@Component
注解 - 确认RabbitMQ服务是否正常运行
-
连接失败
- 检查
application.yml
中的host、port、账号密码 - 防火墙是否开放5672端口
- 检查
-
消息重复消费
- 启用消费者幂等处理
- 使用
@RabbitListener(id = "唯一ID")
七、其他MQ整合(简要)
MQ类型 | 依赖配置 | 核心注解 |
---|---|---|
Kafka | spring-kafka | @KafkaListener |
RocketMQ | rocketmq-spring-boot-starter | @RocketMQMessageListener |
八、总结
通过Spring Boot整合RabbitMQ只需三步:
- 加依赖:
spring-boot-starter-amqp
- 配连接:
application.yml
中设置RabbitMQ地址 - 用注解:
@RabbitListener
实现消息监听
官方文档:Spring AMQP Reference