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

时间:2019-04-11 07:28:32

标签: jpa concurrency jms weblogic

我有一个JMS队列,在多个群集节点上有多个使用者。我收到来自不同发件人的消息。可能有多个消息仅包含一个实体的信息。实体需要与jpa保持一致。当收到有关实体的消息时,该实体可能存在或可能不存在于数据库中。

当两个使用者同时处理同一实体的消息时,就会出现此问题。两个使用者都尝试在数据库上查找实体。因为没有找到实体,所以两者都尝试插入实体而不是更新现有实体。因此,速度更快的一方获胜,而另一方则以异常告终(由于桌上的唯一键约束)。

我想到了一些麻烦的解决方案,方法是对刷新调用进行一些尝试/捕捉。但是我使用容器管理的事务,但刷新和事务结束之间仍然存在差距。

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

我认为这必须是一个非常普遍的挑战,但是直到现在我都找不到一个干净的解决方案。也许我在想错方向。

感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

如果您的JMS提供者支持消息组,则可以将特定实体的所有消息放到一个组中,这样同一组中的所有消息将进入同一使用者并被串行而不是同时处理,从而避免了比赛条件。

通常实现消息组支持,以便消息是否来自同一生产者都没有关系,就像可以从消息内容中确定性地标识组ID一样。例如,如果您发送的消息中包含要存储在数据库中的数据,则可以将组ID设置为主键。因此,具有相同主键的消息将在同一组中,并且将由同一使用者使用。

与常规消息一样,一旦分组消息在队列中可用,便会立即使用它们。普通消息和分组消息之间的唯一区别是,它们始终发送给同一使用者。一个组是否“完整”无关紧要。