我们有生产者以比消费者消费更快的速度生产消息。我们使用Spring JMS集成作为消费者端技术堆栈。目前我们正在使用AUTO_ACKNOWLEDGE
模式。
在侦听器的onMessage()
方法中,收到后我们计划将客户端作业提交到作业队列并从onMessage()
方法返回。这意味着如果a)处理失败或b)我们的服务器在处理过程中发生故障,我们无法恢复。
我们查看了使用CLIENT_ACKNOWLEDGE
的选项,但这意味着确认具有更高时间戳的邮件会自动确认时间戳较少的所有邮件。这对我们来说显然是不可取的,因为成功处理具有较新时间戳的消息绝不意味着所有具有较旧时间戳的消息都被完全处理。实际上,我们正在查看每条消息确认。但是,我在某处读到这意味着存在一些设计缺陷。
另一个选择是使用Spring提供的SessionAwareMessageListener
接口。使用此接口的合同表明,如果从JMSException
抛出onMessage
,则将重新传递该消息。但是,我并不完全确定如何将此用于我们的目的。
当我更多地了解这一点时,我们将非常感谢你们的任何帮助。
答案 0 :(得分:0)
会话感知消息具有以下onMessage原型:
onMessage(Message message, Session session)
为消息重新发送调用session.recover()。 session.recover()会将所有未确认的消息发送回jms目的地。