【发布时间】:2012-01-13 19:46:48
【问题描述】:
如何确保消息确认仅删除消息,直到在 jms 代理中调用确认的消息为止。 目前我有一个系统,它从 jms 队列中消耗并部分处理它。稍后,一批这些消息被另一个线程持久化。我现在需要确认消息。但问题是我必须停止使用消息,否则确认先前收到的消息也会确认收到的所有其他后续消息。
换句话说,假设我在一个队列中有 10 条消息。我消耗了其中的 7 个,然后在第 5 条消息上确认。这反过来会从队列中删除消费者收到的所有 7 条消息。有没有办法只确认并从队列中删除消息,直到第 5 条消息。
编辑:我尝试创建两个会话并从不同的会话中使用,但是(至少使用 apache qpid)这执行不一致。我的意思是不一致,有时在测试过程中,一个消费者能够接收消息,而另一个消费者根本没有收到消息,无论您等待多长时间。这对我来说是一种解决方案,但由于不一致,无法将其用作解决方案。
【问题讨论】:
-
您尚未指定您使用的消息提供程序。但据我所知,许多消息传递提供商不允许随机消息确认。如果您确认一条消息,则在此之前收到的所有消息也将被确认并从队列中删除
-
我使用 apache qpid,我不是随机确认,而是对特定消息进行确认。如果在此之前的所有消息都被清除就可以了,但如果收到更多消息,它们也会被删除。