Spring AMQP 中的“Publisher returns” happen/work 如何处理?

How does the 'Publisher returns" happen/work in Spring AMQP?

我正在研究 RabbitMQ 集成。我有一个从其他服务接收消息的微服务。我目前正在研究如何处理在处理过程中遇到异常的消息。

场景可能是:

  1. ServiceA 将消息发送到引擎的队列。
  2. 引擎处理收到的消息。
  3. 在处理过程中,引擎遇到异常(例如 NullPointerException)
  4. 引擎 returns 消息到 ServiceA 重新处理
  5. ServiceA保持消息直到引擎中的异常被解决(重新发送到引擎可以手动触发)

我遇到了关于 Publisher Returns 的 Spring AMQP documentation,但我无法完全理解上下文。我想知道这是如何工作的,以及这是否可以作为解决上述第 4 项的解决方案。或者有其他解决方案吗?

提前致谢!

对于列表中的第 4 项,解决方案非常简单 - 不要自动确认消息,而是在处理完成时再确认。以这种方式 - 如果客户端(订户)在处理消息期间(无论出于何种原因)死亡,则该消息将重新排队(因此发送到 ServiceA 以在您的情况下进行重新处理)。

如果您想显式地重新排队消息,您可以否定确认(搜索它here)。

在任何重新排队(手动或自动)的情况下,您应该注意导致订阅者死亡的单个消息不会永远被订阅者处理(s),即 - 确保在处理过程中发生的异常是随机的,而不是 guaranteed 事件。这方面的示例是包含无效 XML 的消息 - 您处理它,发现它无效,处理异常并重新排队,但随后另一个(或相同的)订阅者再次获取它,并处理相同的异常,因为消息的内容和里面的XML没有改变等等...