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

Merge data from 2 messages in 1 entity

我有一个 JMS 队列,在多个集群节点上有多个消费者。我收到来自不同发件人的消息。可能有多个消息只包含一个实体的信息。实体需要使用 jpa 进行持久化。当收到实体的消息时,该实体可能已存在也可能不存在于数据库中。

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

我想到了一个糟糕的解决方案,即 try-/catch-around 同花顺。但是我用的是容器管理的事务,flush和事务结束之间还是有间隔的。

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

我认为这一定是一个非常普遍的挑战,但直到现在我还找不到一个干净的解决方案。可能是我想错了。

感谢任何帮助。

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

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

与普通消息一样,一旦分组消息在队列中可用,它们就会被使用。普通消息和分组消息之间的唯一区别是它们总是发送给同一个消费者。组是否 "complete" 无关紧要。