Java 在事务内进行无事务EJB调用

Java 在事务内进行无事务EJB调用,java,jakarta-ee,transactions,ejb,jta,Java,Jakarta Ee,Transactions,Ejb,Jta,我试着描述一下情况。我们有一个网络服务;在每个请求上,web服务启动一个JTA事务。它通过其中的XA数据源执行多个数据库调用,调用一些其他web服务(在事务上下文之外),并在其他服务器上进行两个远程EJB调用 问题是,容器似乎试图将EJB包含到事务中(这似乎是合乎逻辑的),但事实上,我希望它不要参与该事务,因为当它确实参与该事务时,它总是在最后的提交阶段超时,但当我排除EJB调用时,它工作得很好 我不能更改EJB实现,只能控制web服务代码。所以,我的问题是:我如何对事务感知EJB进行EJB调用

我试着描述一下情况。我们有一个网络服务;在每个请求上,web服务启动一个JTA事务。它通过其中的XA数据源执行多个数据库调用,调用一些其他web服务(在事务上下文之外),并在其他服务器上进行两个远程EJB调用

问题是,容器似乎试图将EJB包含到事务中(这似乎是合乎逻辑的),但事实上,我希望它不要参与该事务,因为当它确实参与该事务时,它总是在最后的提交阶段超时,但当我排除EJB调用时,它工作得很好

我不能更改EJB实现,只能控制web服务代码。所以,我的问题是:我如何对事务感知EJB进行EJB调用,但从我的JTA事务中调用,但仍然在其他XA资源的JTA事务中?我希望我把问题说清楚:)

编辑:尝试使用伪代码示例使其更清晰:

// Begin transaction
UserTransaction tx = (UserTransaction) ctx.lookup(USER_TRANSACTION);
tx.begin();

// Do some database operations on XA datasource

// Call remote EJB which has transcation attribute set to 'Supports'
AccountInfo account = accountEjb.getAccountInfo(userId, accountId); // <-- Is it possible to make this to be not be part of user transction?

// Do some more database operations on XA datasource

// Commit transaction
tx.commit();
//开始事务
UserTransaction tx=(UserTransaction)ctx.lookup(USER\u事务);
tx.begin();
//在XA数据源上执行一些数据库操作
//调用Transaction属性设置为“Supports”的远程EJB

AccountInfo account=accountEjb.getAccountInfo(userId,accountId);// EJB事务是声明性的:对于给定EJB的给定部署,指定其事务语义。可以部署确切的EJB(当然,使用不同的名称),并且可以为该部署指定不同的需求。这是假设(a)您至少有ejb的jar,(b)所讨论的ejb是独立的,并且不依赖于其他组件,以及(c)ejb的开发人员没有违反声明性事务的概念,他的bean也在事务上下文之外工作。

ejb事务是声明性的:对于给定ejb的给定部署,您可以指定其事务语义。可以部署确切的EJB(当然,使用不同的名称),并且可以为该部署指定不同的需求。这是假设(a)您至少有ejb的jar,(b)所讨论的ejb是独立的,并且不依赖于其他组件,以及(c)ejb的开发人员没有违反声明性事务的概念,他的bean也在事务上下文之外工作。

您可以创建另一个具有适当事务属性的bean。这个bean可以将所有调用委托给第一个bean


或者您可以从另一个线程调用此ejb。

您可以创建另一个具有适当事务属性的bean。这个bean可以将所有调用委托给第一个bean


或者您可以从另一个线程调用此ejb。

您可以创建另一个具有适当tx属性的方法,然后通过自注入代理(伪代码)调用它:


您可以使用适当的tx属性创建另一个方法,然后通过自注入代理(伪代码)调用它:


我无法控制EJB,但我知道它的事务属性被设置为“Supports”,并且我还对该EJB进行了独立(容器外)调用,没有任何问题。此外,EJB和我的web服务部署在不同的服务器上,我也无法更改。我无法控制EJB,但我知道它的事务属性设置为“支持”,并且我还对该EJB进行了独立(容器外)调用,没有问题。另外,EJB和我的web服务部署在不同的服务器上,我也无法更改。为什么不增加超时时间?因为问题不在超时时间内,所有调用都会在千秒内正常进行,但当事务最终提交时,它会超时,如果从调用序列中删除EJB调用,它会提交ok。因此,我认为它实际上与服务器间通信有关,但与超时值无关。为什么不增加超时值?因为问题不在于超时,所有调用在千秒内都可以正常进行,但当事务最终提交时,它会超时,如果从调用序列中删除ejb调用,没问题。因此,我认为它实际上与服务器间通信有关,但与超时值无关。
@Stateless
public class LocalEJB1 {

    @EJB
    private LocalEJB1 localEJB1;

    @EJB
    private AccountEJB accountEjb;

    @TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED)
    public AccountInfo callNonTx() { 
        return accountEjb.getAccountInfo(userId, accountId); 
    }

    public void yourCurrentMethod() {
        // Begin transaction
        UserTransaction tx = (UserTransaction) ctx.lookup(USER_TRANSACTION);
        tx.begin();

        AccountInfo account = localEJB1.callNonTx();
        // Do some more database operations on XA datasource

        // Commit transaction
        tx.commit();
    }
}