拦截EJB事务回滚

时间:2015-11-05 07:04:56

标签: java-ee transactions interceptor

我有一项任务要完成,包括在我的EJB事务被回滚的情况下回滚对非事务性数据库的更改。

项目使用容器管理的事务,业务逻辑涉及对EJB方法的调用,这些方法本身调用其他EJB方法,因此事务跨越方法边界并涉及多个EJB。

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

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

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

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

1 个答案:

答案 0 :(得分:1)

如果您正在使用容器管理事务,那么当EJB方法调用成功时,可以保证事务已被提交,如果您收到异常,则确保事务已回滚。

所以我看到一种可能的方法是在实际的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
    }
}

您需要在每个相关服务周围放置一个包装器。