Skip to content

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 有了整体认知,接下来可以深入学习高级特性,如延迟队列、消息追踪等。