@RabbitListener注解介绍、应用场景和示例代码

一、注解功能

@RabbitListener 是 Spring AMQP 提供的核心注解,用于将方法标记为 RabbitMQ 消息监听器。它能够监听指定队列的消息,并在消息到达时触发方法执行。


二、核心参数解析

参数说明
queues直接指定监听的队列名称(支持多个队列)
queuesToDeclare动态声明队列(若队列不存在则自动创建)
bindings声明队列、交换机及绑定关系(支持复杂路由配置)
containerFactory指定监听容器工厂(用于自定义并发、确认模式等)
id监听器唯一标识(用于监控和管理)
concurrency并发消费者数量(格式:"min-max")

三、应用场景与示例代码

1. 基础监听

场景:监听一个或多个已存在的队列。

@RabbitListener(queues = "order.queue")
public void handleOrderMessage(Order order) {
    log.info("收到订单消息: {}", order);
}
2. 动态声明队列

场景:在监听的队列不存在时自动创建,适合测试环境或临时队列。

@RabbitListener(queuesToDeclare = @Queue(name = "temp.queue", durable = "false"))
public void handleTempMessage(String message) {
    log.info("临时队列消息: {}", message);
}
3. 绑定交换机与队列

场景:声明直连交换机、队列及路由绑定,支持灵活路由。

@RabbitListener(bindings = @QueueBinding(
    value = @Queue(name = "payment.success.queue", durable = "true"),
    exchange = @Exchange(name = "payment.exchange", type = ExchangeTypes.DIRECT),
    key = "payment.success"
))
public void handlePaymentSuccess(Payment payment) {
    log.info("支付成功通知: {}", payment);
}
4. 多队列监听

场景:同时处理多个队列的消息。

@RabbitListener(queues = {"log.error.queue", "log.warn.queue"})
public void handleLogMessages(LogMessage logMsg) {
    if (logMsg.getLevel().equals("ERROR")) {
        alertService.sendAlert(logMsg);
    }
}
5. 条件化监听

场景:根据配置文件动态启用/禁用监听。

@RabbitListener(
    queues = "${rabbitmq.queue.notification}",
    condition = "${features.notification.enabled:true}"
)
public void handleNotification(Notification notification) {
    // 仅当配置开启时监听
}
6. 消息转换与参数解析

场景:处理不同类型消息(JSON、文本等),支持复杂对象。

@RabbitListener(queues = "user.registration.queue")
public void handleUserRegistration(
    @Payload User user, 
    @Header("source") String source,
    Channel channel) {
    
    if ("mobile".equals(source)) {
        userService.registerMobileUser(user);
    }
    channel.basicAck(deliveryTag, false); // 手动确认
}
7. 异常处理

场景:自定义重试策略和异常处理。

@RabbitListener(
    queues = "retry.queue",
    containerFactory = "retryContainerFactory"
)
public void handleWithRetry(String message) {
    try {
        processMessage(message);
    } catch (BusinessException e) {
        throw new AmqpRejectAndDontRequeueException("业务异常拒绝消息");
    }
}
8. 并发控制

场景:配置消费者并发数量。

@RabbitListener(
    queues = "high.concurrency.queue",
    concurrency = "5-10" // 最少5个,最多10个消费者
)
public void handleHighConcurrency(Event event) {
    // 高并发处理逻辑
}

四、最佳实践

  1. 队列预声明:生产环境建议预先声明队列(通过 RabbitAdmin),而非依赖自动创建。
  2. 幂等性处理:确保消息处理逻辑的幂等性,防止重复消费问题。
  3. 确认模式
    • AUTO:自动确认(默认,易丢失消息)
    • MANUAL:手动确认(推荐,需调用 basicAck/basicNack
  4. 死信队列:配置 x-dead-letter-exchange 处理失败消息。
  5. 监控指标:通过 Micrometer 集成监控消息吞吐量和延迟。

五、完整配置示例(Spring Boot)​

# application.yml
spring:
  rabbitmq:
    host: localhost
    port: 5672
    username: guest
    password: guest
    listener:
      simple:
        acknowledge-mode: manual # 手动确认
        prefetch: 10 # 每个消费者最大未确认数
        retry:
          enabled: true
          max-attempts: 3
          initial-interval: 5000ms

通过灵活组合这些功能,@RabbitListener 可满足从简单到复杂的消息处理需求,是构建可靠消息系统的核心工具。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值