EJB方法在哪里运行

Where is EJB method run

我正在使用下一个代码远程调用 EJB 方法:

RemCallRemote rc = null;
String Text = "";   
Properties props = new Properties();    

//Filling the properties for connection to a remote server
props.put(Context.INITIAL_CONTEXT_FACTORY, "com.sap.engine.services.jndi.InitialContextFactoryImpl");

props.put(Context.PROVIDER_URL, "hostaddress:50004");

props.put(Context.SECURITY_PRINCIPAL, "LOGINNAME");

props.put(Context.SECURITY_CREDENTIALS, "*****");  

props.put(Context.URL_PKG_PREFIXES, "com.sap.engine.services");    

InitialContext ctx = new InitialContext(props);

//getting a reference to an interface
rc = (RemCallRemote)ctx.lookup("ejb:/appName=sap.com/RemoteCallEAR, jarName=RemoteCallEJB.jar, beanName=RemCall, interfaceName=RemCallRemote");

//calling an EJB method
Text = rc.Check();

代码工作正常,但我的问题是:EJB 方法在哪里 运行?它 运行 总是在 'hostaddress' 机器上还是在其他任何地方?

EJB架构基于RMI并使用RMI的Stubs and Skeletons.

在您的示例中,RemCallRemote 是存根,它所做的只是将 Check() 方法回调发送回服务器。

现在 EJB 不再使用骨架,而是依靠容器来处理存根请求。

主机地址是JNDI服务器所在的地址。它并不总是与 EJB 本身所在的服务器相同 运行,尽管在大多数情况下它是。

对于特殊情况,您可以在作为某​​种集群管理器的服务器 2 上的 JNDI 服务器中注册来自服务器 1 的 EJB。不太确定 SAP 是否可行,但例如WebSphere 你可以。

AppServers 使用JNDi 来共享EJB 的信息。当您部署 EJB 时,CORBA 兼容的存根将注册到 AppServer 的 JNDI 服务。 'CORBA compliant stub' 我的意思是这超出了 RMI,并且是独立于平台的体系结构。所以理论上,EJB的客户端也可以是COBOL或C程序!
客户端总是查找 JNDi 服务并请求 EJB 存根。这个存根自然必须是可序列化的。可以说它包含足够的信息,以便客户端可以创建一个对象来充当真实 EJB 的代理。所以在这一点上,情况是,EJB 对象在服务器上,代理在客户端上。我的意思是代理,它隐藏了网络级别的通信细节。
客户端代码现在调用代理上的方法,这些方法通过 CORBA 协议透明地调用到服务器上的 EJB 对象。
所以要回答你的问题,EJB 对象总是在服务器上。它的代理是使用在 JNDI 服务上注册的 CORBA 存根在客户端构建的。 EJB 服务器、JNDI 服务和客户端可以位于不同的机器上。通常 JNDI 服务是部署 EJB 的 AppServer 的一部分。客户端通常是 Web 应用程序,通常部署在与部署 EJB 的位置相同的 AppServer 上,但不一定。客户端有时也是一个胖客户端,例如基于 Swing 或客户端上基于 C#.NET 的 GUI 应用 desktop/laptop。