如何在无状态会话bean中获知需要回滚事务的信息? 例如,我有一个无状态EJB,它正在使用一些业务数据更新LuceneIndex。在具有多个EJB调用的事务中调用该方法。 当一些后来的EJB回滚事务时,我怎么能被告知这个问题,以便我能够回滚我已经写好的LuceneIndex条目?
答案 0 :(得分:1)
您可以通过注入对当前EJBContext的引用然后查询它来执行此操作:
@Stateless
public class LuceneDriver {
@Resource
private EJBContext ejbContext;
public void performLuceneStuff(...) {
try {
...
// update lucene data
...
// update some business data
...
} catch (BusinessException e) {
if (ejbContext.getRollbackOnly()) {
// rollback lucene changes
}
}
}
...
}
答案 1 :(得分:0)
如果会话EJB不是事务性的,则在失败的情况下将无法回滚。这是因为无状态会话EJB缺少状态信息。
解决此问题的一种解决方案是使用实现javax.ejb.SessionSynchronization
接口的@Stateful会话Bean。该界面允许您对回滚做出反应。
另一种解决方案是使用主事务通过JPA编写的自定义EventLog条目。借助这些eventLog条目,另一个无状态会话EJB可以验证是否存在新的EventLog条目,并且它们可以对此做出反应。如果回滚了事务,则事务管理器还将删除未提交的EventLog条目。因此,这是将非事务性功能耦合到基于JPA容器的事务的解决方案。看到问题:How to react on a EJB3 transaction commit or rolleback?