我正在使用下一个代码远程调用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”机器上还是在其他任何地方运行?
答案 0 :(得分:0)
EJB体系结构基于RMI并使用RMI' Stubs and Skeletons。
在您的示例中,RemCallRemote是存根,它所做的只是将Check()
方法调用发送回服务器。
现在EJB不再使用Skeletons并依赖容器来处理Stubs请求。
答案 1 :(得分:0)
主机地址是JNDI服务器所在的位置。它并不总是与EJB本身运行的服务器相同,尽管在大多数情况下它都是。
对于特殊情况,您可以在服务器2上的JNDI服务器中注册来自server1的EJB,该服务器充当某种集群管理器。不确定SAP是否可以使用,但是例如你可以使用WebSphere。
答案 2 :(得分:0)
AppServer使用JNDi来共享EJB的信息。部署EJB时,会向AppServer的JNDI服务注册CORBA 兼容存根。通过'CORBA兼容存根',我的意思是这是超出RMI的东西,并且是独立于平台的架构。所以从理论上讲,EJB的客户端也可以是COBOL或C程序! 客户端总是查找JNDi服务并询问EJB的存根。这个存根自然必须是可序列化的。可以说它包含足够的信息,以便客户端可以创建一个充当真实EJB代理的对象。所以在这一点上,情况是,EJB对象在服务器上,而代理在客户端上。通过代理我的意思是,它隐藏了网络级别的通信细节 客户端代码现在调用代理上的方法,这些方法通过CORBA协议透明地调用到服务器上的EJB对象 因此,为了回答您的问题,EJB对象始终在服务器上。它的代理是在客户端上使用在JNDI服务上注册的CORBA存根构建的。 EJB服务器,JNDI服务和客户端可以位于不同的计算机上。通常,JNDI服务是部署EJB的AppServer的一部分。客户端通常是一个Web应用程序,通常部署在与部署EJB的AppServer相同的AppServer上,但不一定如此。客户端有时也是基于Swing的胖客户端,或者是客户端桌面/笔记本电脑上基于C#.NET的GUI应用程序。