【问题标题】:Asynchronous EJB method and rollback异步 EJB 方法和回滚
【发布时间】:2013-08-21 12:56:30
【问题描述】:

假设有一个结构如下的 EJB:

@Stateless
public class MyBean {
@PersistenceContext
private EntityManager entityManager;

    public void doSomething() {
        ...
        doAsynchronously();
        ...
        entityManager.persist(someObject);          
        ...
        if (...) {
            throw new RuntimeException();
        }
    }   

    public void doAsynchronously() {
        ...
        entityManager.persist(someOtherObject);
        ...
    }
}

是否正确,当同步部分抛出异常并因此回滚事务时,异步调用不受此影响,并且如果该方法中没有发生错误,实体管理器上的操作应该正确完成?

我发现了很多关于异步 bean 的示例,但在这两种情况下都没有结合使用实体管理器,所以如果有人能引导我找到一个,我会很高兴。


编辑 2013/08/22:

另一个问题 - 代码片段中显示的设置的全部原因是确保doAsynchronously() 中的代码可以完全完成其对实体的操作,无论调用者方法中是否发生异常 - 所以如果我不使用 @Asynchronous@TransactionAttribute(REQUIRES_NEW) 进行注释,我会得到相同的行为吗?

【问题讨论】:

    标签: asynchronous jpa-2.0 java-ee-6


    【解决方案1】:

    异步方法在另一个线程中执行,因此不会在当前事务的上下文中执行,并且还将使用另一个持久性上下文。

    如果目标是开始一项新事务,不受当前事务中的错误影响,REQUIRES_NEW 确实是解决方案。但简单地使用 REQUIRES_NEW 不会使调用异步:它会阻塞当前事务,直到新事务完成,然后当前事务将恢复。

    【讨论】:

    • 感谢您的确认。我知道第二种解决方案是同步的,但正如我所说,其目的是完成某些实体操作,即使其他实体操作由于异常而回滚,而不是它必须异步运行。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-01-17
    • 2013-05-23
    • 1970-01-01
    • 2012-12-28
    • 1970-01-01
    • 2010-11-27
    • 2013-06-12
    相关资源
    最近更新 更多