使用可运行的事务

时间:2018-10-05 13:53:52

标签: java-ee transactions ejb

我使用此方法有一个@Singleton ejb类。事务在方法主体的末尾提交,但是myRunnable线程中还有其他一些东西,希望它包含在当前事务中。有什么办法吗?

@PostConstruct
public void init() {
    try {
        // do some other stuff
        managedExecutorService.execute(myRunnable);
    } catch (Exception e) {
        LOG.error("Error when initializing...", e);
    }
}

3 个答案:

答案 0 :(得分:2)

不,无法在2个线程之间共享事务上下文。

出于相同的原因,您不能将事务上下文转移到异步EJB调用。

您应该将事务视为始终是线程绑定的。

答案 1 :(得分:2)

您的“ myRunnable线程”不能包含在正在运行的事务中。

您不得使用Java executor服务(EJB Spec 16.2.2)或直接管理线程:

  

企业bean不得尝试管理线程。 ...这些功能是为EJB容器保留的。允许企业bean管理线程会降低容器正确管理运行时环境的能力。

您必须使用Java EE 7中引入的managed executor service

关于交易,文档说:

  

任务在Java™EE产品提供者提供的托管线程中运行,并在提交任务的应用程序组件上下文中运行。所有任务都在没有显式事务的情况下运行(它们不参与应用程序组件的事务)。如果需要事务,请使用UserTransaction实例。在JNDI中可以使用名称“ java:comp / UserTransaction”或通过使用Resource注释请求注入UserTransaction对象来使用UserTransaction实例。

答案 2 :(得分:0)

您可以创建1个方法,并使用TransactionAttributeType.MANDATORY调用其他2个方法

public void yourMethod(){
    yourMethod1();
    yourMethod2();
}

@TransactionAttribute(TransactionAttributeType.MANDATORY)
private void yourMethod1(){
}

@TransactionAttribute(TransactionAttributeType.MANDATORY)
private void yourMethod2(){
}

TransactionAttributeType.MANDATORY将使用来自调用方的交易