Appearance
Spring AMQP
INFO
Spring AMQP 为基于 AMQP 协议(最常见实现为 RabbitMQ)的应用提供了 模板化、声明式的编程模型,让开发者可以像使用 Spring JDBC 一样 “只关心业务,不关心连接细节”。
1. Spring AMQP 解决什么问题?
- 屏蔽底层连接与通道管理
- 提供
RabbitTemplate
简化消息发送 - 通过
@RabbitListener
实现注解式消息监听 - 支持事务、重试、确认、死信等高级特性
TIP
当系统需要削峰填谷、服务解耦或异步处理时,优先考虑消息队列,而 Spring AMQP 提供了快速落地的最佳实践。
2. 典型业务场景
- 订单创建后异步发送“下单成功短信”
- 物流状态更新时推送 WebSocket 通知
- 高并发秒杀活动中的库存扣减
时序图:下单成功短信异步发送
3. 代码示例:订单短信异步发送
kotlin
/*
* build.gradle.kts 依赖:
* implementation("org.springframework.boot:spring-boot-starter-amqp")
*/
@Service
class OrderService(
private val rabbitTemplate: RabbitTemplate
) {
fun createOrder(req: OrderReq): OrderResp {
// 1) 业务持久化 ...
val orderId = saveOrder(req)
// 2) 发送短信任务
val msg = SmsTask(orderId, req.phone, "恭喜下单成功!")
rabbitTemplate.convertAndSend(
"sms.exchange", // 交换机
"sms.routing.key", // 路由键
msg // 消息体会自动序列化为 JSON
)
return OrderResp(orderId)
}
}
@Component
class SmsListener {
@RabbitListener(queues = ["sms.queue"])
fun handle(task: SmsTask) {
// 监听器线程异步执行
// 调用短信网关...
println("发送短信给 ${task.phone}")
}
}
/** 数据类示例 */
data class SmsTask(val orderId: Long, val phone: String, val text: String)
java
@Service
public class OrderService {
private final RabbitTemplate rabbitTemplate;
public OrderService(RabbitTemplate rabbitTemplate) {
this.rabbitTemplate = rabbitTemplate;
}
public OrderResp createOrder(OrderReq req) {
Long orderId = saveOrder(req); // ...业务持久化
SmsTask task = new SmsTask(orderId, req.getPhone(), "恭喜下单成功!");
rabbitTemplate.convertAndSend("sms.exchange", "sms.routing.key", task);
return new OrderResp(orderId);
}
}
@Component
public class SmsListener {
@RabbitListener(queues = "sms.queue")
public void handle(SmsTask task) {
System.out.println("发送短信给 " + task.getPhone());
}
}
4. 核心组件速查表
组件 | 作用 |
---|---|
RabbitTemplate | 同步 / 异步发送消息的门面对象 |
AmqpAdmin | 声明交换机、队列、绑定关系 |
SimpleRabbitListenerContainerFactory | 定义监听容器的并发、确认模式 |
@RabbitListener | 注解式消费,支持方法级配置 |
WARNING
生产环境请务必开启消息确认、失败回退以及死信队列以保证可靠性。
🎉 至此,你已经对 Spring AMQP 有了整体认知,接下来可以深入学习高级特性,如延迟队列、消息追踪等。