合并来自1个实体中的2条消息的数据

问题描述 投票:0回答:1

我有一个JMS-Queue,在多个集群节点上有多个使用者。我收到来自不同发件人的邮件。可能有多条消息只包含一个实体的信息。实体需要与jpa持久化。当接收到实体的消息时,该实体可能已经存在或者可能尚未存在于数据库中。

当2个消费者同时处理同一实体的消息时,问题就会出现。两个消费者都试图在数据库中找到该实体。因为没有找到实体,所以都尝试插入实体而不是更新现有实体。因此,获胜的速度越快,另一个最终会出现异常(因为表上存在唯一的键约束)。

我通过做一些try- / catch-around flush-calls来考虑一个讨厌的解决方案。但是我使用容器管理的事务,并且在flush和事务结束之间仍然存在差距。

第二个想法是关于合并和持久的区别。但即使它可能与合并一起使用,也会导致覆盖现有数据。

我认为这是一个非常普遍的挑战,但到目前为止我找不到一个干净的解决方案。也许我在想错误的方向。

任何帮助表示赞赏。

jpa concurrency jms weblogic
1个回答
0
投票

如果您的JMS提供程序支持消息组,您可以将特定实体的所有消息放入一个组中,这样,同一组中的所有消息将转到同一个消费者并进行串行处理而不是同时处理,从而避免竞争条件。

通常实现消息组支持,使得消息是否来自同一生产者并不重要,因为有一种方法可以确定地从消息内容中识别组ID。例如,如果您要发送包含要存储在数据库中的数据的消息,则可以将组ID设置为主键。因此,具有相同主键的消息将位于同一组中,并且将由同一个消费者使用。

分组消息一旦在队列中可用就会被消耗,就像普通消息一样。普通消息和分组消息之间的唯一区别是它们总是发送给同一个消费者。一个群体是否“完整”是无关紧要的。

© www.soinside.com 2019 - 2024. All rights reserved.