【问题标题】:Intercept EJB transaction rollback拦截 EJB 事务回滚
【发布时间】:2015-11-05 07:04:56
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

    标签: jakarta-ee transactions interceptor


    【解决方案1】:

    如果你使用的是Container Managed Transactions,那么当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
        }
    }
    

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

    【讨论】:

    • 谢谢@jhyot,我认为这可能是要走的路,因为这是我能看到的唯一方法,以确保业务方法已完成并且交易处于其状态通过或失败。我在未来看到了很多重构:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-12-28
    • 1970-01-01
    • 1970-01-01
    • 2014-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多