如何使无状态会话bean具有事务感知功能?

时间:2017-07-20 12:25:20

标签: java-ee transactions ejb

如何在无状态会话bean中获知需要回滚事务的信息? 例如,我有一个无状态EJB,它正在使用一些业务数据更新LuceneIndex。在具有多个EJB调用的事务中调用该方法。 当一些后来的EJB回滚事务时,我怎么能被告知这个问题,以便我能够回滚我已经写好的LuceneIndex条目?

2 个答案:

答案 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?