【问题标题】:Closing remote EJB connection during managed transaction在托管事务期间关闭远程 EJB 连接
【发布时间】:2014-05-08 14:20:52
【问题描述】:

我有以下情况:

  1. 客户端正在调用无状态本地 EJB - 托管事务从此调用开始
  2. 本地 EJB 构建 InitialContext 并查找远程 EJB
  3. 本地 EJB 调用远程 EJB 上的方法
  4. 本地 EJB 关闭上下文和与远程 EJB 的连接
  5. 容器尝试提交事务

无法提交分布式事务,因为无法联系到参与事务的远程 EJB 的连接,因为与它的连接已关闭。

我的问题是:当事务已经处于活动状态时,是否可以使用远程 EJB 调用?我应该如何关闭用于查找远程 EJB 的上下文?

以下伪代码说明了我的问题:

@Stateless
public class LocalEjb {

  public void localEJBMethod() {
    //transaction starts before this method execution

    Context ctx = //create initial context
    RemoteEjb remoteEjb = (RemoteEjb) ctx.lookup("jndi name");
    remoteEjb.remoteMethod(); //remote EJB takes part in distributed transaction
    ctx.close();    

    //error occurrs when container tries to commit distributed transaction after
    //this method returns
  }
}


public class ClientClass { //a CDI component, for example
    @EJB
    private LocalEjb localEjb;

    public void clientMethod() {
        localEjb.localEjbMethod();
    }
}

【问题讨论】:

    标签: jakarta-ee ejb java-ee-6 distributed-transactions initial-context


    【解决方案1】:

    事务将起作用,因为应用程序服务器使用 XA(分布式)事务。

    摆脱 ctx.close()

    它实际上并没有关闭与远程 ejb 的连接(由动态代理对象处理),您正在关闭对 JNDI 上下文的访问,其中包含事务管理器的句柄。

    还要记住,您需要让容器知道您正在使用另一个 EJB。所有容器管理对象都需要向应用服务器声明它们的资源需求(ejb、数据源等)。在关于您的示例中,您会将您的声明放在 ejb-jar.xml 中。

    您可以考虑对远程 EJB 使用 @EJB 注释而不是显式查找。这将向应用程序服务器声明资源使用情况,并为您管理引用。

    【讨论】:

      猜你喜欢
      • 2012-04-10
      • 1970-01-01
      • 2013-03-01
      • 1970-01-01
      • 2014-02-10
      • 2019-07-19
      • 2017-03-03
      • 1970-01-01
      相关资源
      最近更新 更多