首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >拦截EJB事务回滚

拦截EJB事务回滚
EN

Stack Overflow用户
提问于 2015-11-05 07:04:56
回答 1查看 1.2K关注 0票数 1

我有一项任务要完成,这涉及在EJB事务回滚时回滚对非事务性数据库的更改。

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

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

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

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

EJB拦截器和事务生命周期或如何拦截提交/失败事件?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-11-06 09:01:07

如果您使用的是,那么当EJB方法调用成功时,就可以保证事务已经完成,如果您得到了异常,那么就可以确保事务已经回滚了。

因此,我看到的一种可能的方法是在实际的EJB调用中使用EJB包装器(REQUIRES_NEW在这里很重要)。

代码语言:javascript
复制
@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
    }
}

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33538473

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档