异步EJB方法和回滚

时间:2013-08-21 12:56:30

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

假设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),我会得到相同的行为吗?

1 个答案:

答案 0 :(得分:2)

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

如果目标是启动一个新事务,不受当前错误的影响,REQUIRES_NEW确实是解决方案。但是简单地使用REQUIRES_NEW将不会使调用异步:它将阻止当前事务的新事件,并且当前事务将恢复。