jakarta-ee - 单个应用程序服务器实例中不同应用程序中的 EJB 本地/远程接口(interface)

标签 jakarta-ee weblogic ejb application-server oc4j

假设部署了两个 EAR 的单个应用程序服务器实例。第一个 EAR 使用远程 EJB 接口(interface)从第二个 EAR 调用 EJB。

有传言说,即使调用是使用远程接口(interface)实现的,应用服务器也知道一切都在同一个 JVM 中,并在内部使用具有本地接口(interface)机制的远程接口(interface),即它不通过 RMI 调用方法,不打开任何套接字,并且不序列化/反序列化对象。

这是真的?如果有人对 Weblogic 10.3.2 和 OC4j 10.1.3 关于此问题的行为有任何反馈,我们将不胜感激。

最佳答案

不,这不是真的。如果 ORB 实现本地对象优化(有时是“并置对象”),那么它不会打开任何套接字,但会执行序列化/反序列化,这通常比编码更快。制作额外的对象副本是为了避免违反编程模型。

生成的 stub 启用此优化。这是一个示例界面:

public interface a extends Remote {
  public ArrayList test(ArrayList in1, ArrayList in2) throws RemoteException;
}

这是 rmic -iiop -keep a 的结果:
public ArrayList test(ArrayList arg0, ArrayList arg1) throws java.rmi.RemoteException {
    if (!Util.isLocal(this)) {
        /* ... trim remote code ... */
    } else {
        ServantObject so = _servant_preinvoke("test",a.class);
        if (so == null) {
            return test(arg0, arg1);
        }
        try {
            Object[] copies = Util.copyObjects(new Object[]{arg0,arg1},_orb());
            ArrayList arg0Copy = (ArrayList) copies[0];
            ArrayList arg1Copy = (ArrayList) copies[1];
            ArrayList result = ((a)so.servant).test(arg0Copy, arg1Copy);
            return (ArrayList)Util.copyObject(result,_orb());
        } catch (Throwable ex) {
            Throwable exCopy = (Throwable)Util.copyObject(ex,_orb());
            throw Util.wrapException(exCopy);
        } finally {
            _servant_postinvoke(so);
        }
    }
}

当 stub 连接到本地对象时,它调用 ObjectImpl._servant_preinvoke 以在同一 JVM 中定位服务方(在您的情况下为 EJB 包装器)。然后,它复制输入参数(模拟编码),调用方法,并复制结果对象(再次模拟编码)。

我不是 WebLogic 专家。也就是说,本文档暗示 WebLogic 执行并置对象优化:

http://download.oracle.com/docs/cd/E13222_01/wls/docs61/cluster/object.html#1007328

关于jakarta-ee - 单个应用程序服务器实例中不同应用程序中的 EJB 本地/远程接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2721285/

相关文章:

java - 在 Payara 5 中部署包含 ejb-module 的ear-file 时出现问题

JSF View Scoped Bean 多次重构

java - 如何在应用程序服务器上编写并发(创建线程)代码?

java - 如何在 GlassFish 上指定过滤器映射的顺序?

Java SE 版本 <-> Java EE 版本兼容性矩阵

java - weblogic 10.3.5 安装错误。无法识别的选项 : -jrockit

Java:MDB 和 Spring 的 SingletonBeanFactoryLocator

jakarta-ee - 如何回滚事务并继续处理更新?

java - 是什么决定了 eclipselink 在哪里寻找 @Column、@Temporal 和 @Id 注释?

java - 查找后从数据源获取 JNDI 名称