假設部署了兩個EAR的單個應用程序服務器實例。第一個EAR使用遠程EJB接口從第二個EAR調用EJB。單個應用程序服務器實例中單獨應用程序內的EJB本地/遠程接口
傳言即使調用是使用遠程接口實現的,應用程序服務器也知道一切都在同一個JVM中,並且在內部使用遠程接口和本地接口機制,即它不通過RMI調用方法,不打開任何套接字,也不會序列化/反序列化對象。
這是真的嗎?如果有人對此問題有關於Weblogic 10.3.2和OC4j 10.1.3的行爲的反饋,將會非常感激。
假設部署了兩個EAR的單個應用程序服務器實例。第一個EAR使用遠程EJB接口從第二個EAR調用EJB。單個應用程序服務器實例中單獨應用程序內的EJB本地/遠程接口
傳言即使調用是使用遠程接口實現的,應用程序服務器也知道一切都在同一個JVM中,並且在內部使用遠程接口和本地接口機制,即它不通過RMI調用方法,不打開任何套接字,也不會序列化/反序列化對象。
這是真的嗎?如果有人對此問題有關於Weblogic 10.3.2和OC4j 10.1.3的行爲的反饋,將會非常感激。
不,這是不正確的。如果ORB實現局部對象優化(有時是「並置對象」),那麼它不會打開任何套接字,但它將執行序列化/反序列化,這通常比編組更快。額外的對象副本是爲了避免違反編程模型。
生成的存根啓用此優化。下面是一個例子接口:
public interface a extends Remote {
public ArrayList test(ArrayList in1, ArrayList in2) throws RemoteException;
}
這裏是RMIC -iiop -keep一個結果:
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);
}
}
}
當短截線連接到本地對象,它調用ObjectImpl._servant_preinvoke以定位servant(在你的情況下是一個EJB包裝)在同一個JVM中。然後,它會複製輸入參數(模擬編組),調用方法並複製結果對象(再次模擬編組)。
我不是WebLogic專家。也就是說,本文檔意味着WebLogic執行並列對象優化:
http://download.oracle.com/docs/cd/E13222_01/wls/docs61/cluster/object.html#1007328