EJB - 在MDB中提交和刷新

时间:2015-08-28 13:22:54

标签: jpa glassfish ejb eclipselink

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

例如:

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上下文之外的状态(例如,通过直接登录DB并检查元组的值)。

这似乎与交易有关。从在线资料中,它听起来像是在onMessage()的上下文中启动事务,并且在方法完成之前不会提交。因此,中间状态永远不会被提交,因为我们最终会写“完成!”它会在PersistentContext中覆盖Foo的值。

是否有解决此类问题的方法?某种方式来控制交易的上下文?

1 个答案:

答案 0 :(得分:0)

我认为您希望实现的是在此事务提交之前查看来自事务外部的更改。那么这只有在事务隔离设置为读取未提交时才可能,我不认为这是您的数据库中的默认值。

您可以使用以下属性添加记录数据的方法:@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)

在这种情况下,容器必须暂停当前事务,创建将在此方法中执行的新事务,并且当它完成时,将恢复主事务。