Spring AMQP 下 Publisher Confirms 和 Publisher Returns 的对比


ReturnCallbackConfirmCallback 是在使用 Spring AMQP(Spring Data RabbitMQ)框架时,对标准 RabbitMQ 客户端的 ReturnListenerConfirmListener 机制进行的高级封装。

它们是 Spring Boot/Spring Cloud 应用中实现消息可靠性的核心接口


1. 🔄 ConfirmCallback (对应 Publisher Confirms)

ConfirmCallback 接口用于处理 生产者确认(Publisher Confirms) 的结果。它告诉生产者消息是否已被 RabbitMQ Broker 成功接收。

关注点

  • 关注阶段: 生产者 $\rightarrow$ Broker。
  • 如何使用: 将该回调实现类加到 correlationDatafuture中(每次发消息都要指定,因此一般是写在业务代码中)。
  • 核心逻辑:
    • 如果 acktrue:表示消息安全到达 Broker,可以从重发队列或内存中移除这条消息。
    • 如果 ackfalse:表示消息未能被 Broker 接收(通常是网络问题或 Broker 内部错误),需要根据 correlationData 尝试重发或记录失败日志。

2. ↩️ ReturnCallback (对应 Publisher Returns)

ReturnCallback 接口用于处理 生产者返回(Publisher Returns) 的事件。它告诉生产者消息虽然被 Broker 接收了,但 Exchange 无法将其路由到任何队列。

关注点

  • 关注阶段: Exchange $\rightarrow$ Queue。
  • 如何使用: 将该回调实现类注入到 Spring 的 RabbitTemplate 中(只能配置一个,配置类中配置)
  • 核心逻辑:
    • 该回调方法被调用,意味着消息已丢失(无法被消费者获取)。
    • 生产者应检查 replyTextroutingKey,通常需要记录详细日志,然后将 message 重新发送到备用 Exchange 或人工处理队列,以防止数据丢失。

📊 总结对比 (Spring AMQP 视角)

特性 ConfirmCallback ReturnCallback
底层对应 Publisher Confirms (Ack/Nack) Publisher Returns
何时触发 消息被 Broker 接收/拒绝 消息被 Exchange 接收无法路由 到任何队列时
关注重点 接收的安全性 路由的准确性
核心参数 ack (布尔值) 和 cause(reason) messagereplyCode/replyText
典型处理 Ack: 清除记录;Nack: 重发消息 记录日志并决定是否 重新路由

重要提示:

在 Spring AMQP 中,这两个回调函数是实现端到端可靠性的黄金搭档。它们使业务逻辑能够清晰地处理消息发送过程中的所有异常情况。

使用步骤

1.image-20251105162446530

2.image-20251105162521843

image-20251105162550437

但是以上机制都一般不会开启