2015-11-05 177 views
1

我有一个任务需要完成,这涉及到在我的EJB事务回滚的情况下回滚对非事务数据库的更改。拦截EJB事务回滚

该项目采用容器管理的事务和业务逻辑涉及到自己调用其他EJB方法的EJB方法调用,因此交易跨越边界的方法,并涉及多个EJB。

的EJB事务回滚工作正常,但我需要能够检测到它已经发生,然后将试图回滚其他非交易数据库的方法灭火。

我想知道如何使用拦截器,但似乎我只能截取特定的方法调用,或一个特定的EJB生命周期事件。这对我的目的来说还不够。我需要拦截事务回滚事件。这可能吗?我吠叫错了树吗?也许还有另一种方法可以更好地适合我的目的。

我看到了相关的问题,但它并没有真正帮助我,因为我有许多切入点,许多嵌套的方法和我不能只截取一个方法。

EJB Interceptors and transaction lifecycle OR how to intercept a commit/failure event?

回答

1

如果您正在使用容器管理事务,那么当EJB方法调用成功,这是保证该交易已经COMMITED,如果你得到一个异常,则确保了交易的有已经回滚。

所以,我看到的是周围使用实际的EJB调用EJB包装一个可能的方式(REQUIRES_NEW在这里很重要)。

@Stateless 
public class EJBWrapper { 

    @EJB 
    private EJBService service; 

    public void wrapperMethod() { 
     try {  
      service.actualMethod(); // the real work is done here 
     } catch (RuntimeException) { 
      // transaction has been rolled back here 
     } 
    } 
} 

@Stateless 
public class EJBService { 

    @TransactionAttribute(TransactionAttributeType.REQUIRES_NEW) 
    public void actualMethod() { 
     // do your work here 
    } 
} 

您需要在每个相关服务中包装一个包装。

+0

感谢@jhyot,我想这可能是要走的路,因为它是我可以看到,以确保业务方法完成,交易是在它已经通过或失败状态的唯一途径。我在未来看到很多重构:) – Matt