我使用此方法有一个@Singleton
ejb类。事务在方法主体的末尾提交,但是myRunnable线程中还有其他一些东西,希望它包含在当前事务中。有什么办法吗?
@PostConstruct
public void init() {
try {
// do some other stuff
managedExecutorService.execute(myRunnable);
} catch (Exception e) {
LOG.error("Error when initializing...", e);
}
}
答案 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将使用来自调用方的交易