2017-06-06 35 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應用程序。