2017-06-06 41 views
1

我remotly调用EJB方法使用下面的代码:哪里是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

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

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

+0

您的回答非常丰富。谢谢。你是对的。 SAP服务器是多个Java应用程序服务器的集群。即使我使用特定的物理服务器名称(可以这样做)来调用EJB,也不保证EJB将在特定的物理服务器上运行。这由SAP Java管理服务决定。 – Skalozub

0

EJB体系结构基于RMI并使用RMI的Stubs and Skeletons

在你的例子中,RemCallRemote是存根,它所做的就是将Check()方法调用回服务器。

现在EJB不再使用Skeletons了,它依赖容器来处理Stubs请求。

0

AppServers使用JNDi来共享EJB的信息。在部署EJB时,CORBA兼容存根通过AppServer的JNDI服务注册。通过“CORBA兼容存根”,我的意思是这是超越RMI的东西,并且是独立于平台的体系结构。因此理论上,EJB的客户端也可以是COBOL或C程序!
客户端总是查找JNDi服务并询问EJB的存根。这个存根必然是可序列化的。可以说它包含足够的信息,以便客户端可以创建一个对象来充当真正的EJB的代理。所以在这一点上,情况是,EJB对象在服务器上,代理在客户端上。代理我的意思是,它隐藏了网络级别的通信细节。
客户端代码现在调用代理上的方法,这些方法通过CORBA协议透明地调用到服务器上的EJB对象。
所以要回答你的q,EJB对象总是在服务器上。它的代理是在客户端使用在JNDI服务上注册的CORBA存根创建的。 EJB服务器,JNDI服务和客户端可以位于不同的机器上。通常,JNDI服务是部署EJB的AppServer的一部分。客户端通常是通​​常部署在与部署EJB相同的AppServer上的Web应用程序,但不一定。客户端有时也是基于Swing的胖客户端,或客户端桌面/笔记本电脑上基于C#.NET的GUI应用程序。