我们有生产者以比消费者可以消费的速度更快的速度生产消息。我们使用 Spring JMS 集成作为消费者端技术栈。目前我们正在使用AUTO_ACKNOWLEDGE
模式。
在onMessage()
侦听器的方法中,收到后我们计划将客户端作业提交到作业队列并从该onMessage()
方法返回。这意味着如果 a) 处理失败或 b) 我们的服务器在处理过程中出现故障,我们将无法恢复。
我们查看了使用的选项CLIENT_ACKNOWLEDGE
,但这意味着确认具有较高时间戳的消息会自动确认具有较小时间戳的所有消息。这对我们来说显然是不可取的,因为成功处理具有较新时间戳的消息并不意味着所有具有较旧时间戳的消息都被完全处理。实际上,我们正在查看每条消息确认。但是,我在某处读到这意味着存在一些设计缺陷。
另一种选择是使用SessionAwareMessageListener
Spring 提供的接口。使用此接口的合同规定,如果JMSException
从消息中抛出a,onMessage
则将重新传递。但是,我不完全确定如何将其用于我们的目的。
虽然我自己对此进行了深入研究,但我们将不胜感激你们的任何帮助。