【发布时间】:2013-11-17 17:38:40
【问题描述】:
我有一个案例,其中有一个批量操作正在处理多个项目。处理完所有项目后,我必须将操作状态更新为已完成。多个消费者并行处理项目。
理论上,消费者在处理完一个项目后可以检查是否没有剩余项目(或队列中没有针对此操作的消息),但有可能两个消费者(A 和 B)同时完成,他们两者同时检查,他们都看到另一个还没有准备好(因为事务尚未提交) - 消费者 A 不会看到消费者 B 所做的更改,消费者 B 也不会看到消费者 A 所做的更改,所以他们都不会更新动作状态。我说的对吗?
如何在没有某种额外的定期检查状态且没有开销的情况下实现这种条件?如果每个操作有数千个项目,定期检查可能会很好,但如果通常有 1-2 个长期运行的项目,则效率非常低。
谢谢!
编辑:简而言之-在处理一组消息后触发某些操作的正确方法是什么,但是:
- 消息必须并行处理
- 定期检查是否所有消息都已处理不是答案
【问题讨论】:
-
您可以发布您尝试过的内容吗,最好以SSCCE 的形式发布?
-
will see that the other one is still not ready另一个是谁?你能解释一下吗? -
@Daemon - 当前代码会定期检查,我想删除它。我没有任何代码可以回答我的问题。为什么我要“尝试”任何事情?一旦我知道我想写什么 - 我会写它,这是一个理论问题。我有几个想法如何实现,但这个问题听起来很常见,所以必须有一些每个人都使用的规范解决方案。
-
@Trying - 我稍微更新了问题以使其更清晰
-
如何知道组中的所有消息何时被消费 -
CorrelationID,JMS 事务,XA 事务,其他?