【发布时间】:2018-04-02 11:52:41
【问题描述】:
我将 Amazon SQS 与 Amazon SQS-JMS java 库与 Java EE 7 一起使用。我想要实现的是在收到消息后,具体取决于业务逻辑应用程序要么确认(使用)消息,要么再次将其重新发送到队列,并在 3 次重试失败后将其移至 DLQ。
我想在 JMS 中使用 CLIENT_Acknowledge 模式并且只确认成功处理的消息,但这是来自他们的官方文档:
在此模式下,当消息被确认时,在此消息之前收到的所有消息也会被隐式确认。例如,如果收到了 10 条消息,并且只有第 10 条消息被确认(按照收到消息的顺序),那么之前的 9 条消息也都被确认。
对我来说,这是一种奇怪的行为,与我对 client_acknowledge 的期望相反。这里有比仅仅根据进程状态手动将整个代码中的消息发送到主 SQS 队列或 DLQ 更优雅的解决方案吗?
【问题讨论】:
-
为什么要向队列重新发送消息?一条消息应该被消费和删除,或者不理会。您希望通过“确认”消息来实现什么目标?
-
@JohnRotenstein 由于我第一次收到事件 B 时的业务逻辑,而不是 A,我想在处理事件 A 后将 B 返回到队列并处理它。另外我想使用重试计数和移动消息在 3 失败后到 DLQ,所以返回消息到队列是有意义的。
-
SQS 可以提供自己的 DLQ 逻辑。此外,如果您使用 SQS FIFO 队列,它可以保证排序。鉴于这些内置功能,我建议您不要重新处理消息 - 只需将它们拉出,处理它们,然后删除它们。
标签: java amazon-web-services jms message-queue amazon-sqs