一、注解功能
@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) {
// 高并发处理逻辑
}
四、最佳实践
- 队列预声明:生产环境建议预先声明队列(通过
RabbitAdmin
),而非依赖自动创建。 - 幂等性处理:确保消息处理逻辑的幂等性,防止重复消费问题。
- 确认模式:
AUTO
:自动确认(默认,易丢失消息)MANUAL
:手动确认(推荐,需调用basicAck
/basicNack
)
- 死信队列:配置
x-dead-letter-exchange
处理失败消息。 - 监控指标:通过
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
可满足从简单到复杂的消息处理需求,是构建可靠消息系统的核心工具。