EJB - 在 MDB 中提交和刷新

EJB - Commit and flush within a MDB

我有一个消息驱动的 bean,它通过 EntityManager 与数据库通信。 EM 是通过@PersistenceContext 注入的,就像正常情况一样。我想立即刷新对实体的更改,而无需等待 MDB 完全完成其对给定消息的处理。

例如:

MDB's onMessage() {
  Foo f = em.find(Foo.class, 123);
  f.setNewStatus("Performing work!");
  em.merge(f);
  em.flush();
  ...
  // Continue doing a lot of work...
  ...

  f.setNewStatus("Done!");
  em.merge(f);
  em.flush();
}

问题是我从未从 MDB 上下文外部看到 "Performing Work!" 状态(例如,通过直接登录到数据库并检查元组的值)。

这似乎与交易有关。从网上 material 看来,事务似乎是在 onMessage() 的上下文中启动的,并且在该方法完成之前不会提交。因此,中间状态永远不会提交,因为我们最终写入 "Done!" 覆盖了 PersistentContext 中的 Foo 值。

是否有解决此类问题的方法?某种控制事务上下文的方法?

我认为您想要实现的是在提交此事务之前从事务外部查看更改。好吧,这只有在事务隔离设置为 Read uncommitted 时才有可能,我认为这在您的数据库中不是默认设置。

你可以做的是添加方法,它将记录你的数据,属性为:@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)

在这种情况下,容器将不得不暂停当前事务,创建将在此方法中执行的新事务,完成后,将恢复主事务。