2010-04-27 95 views
6

假設部署了兩個EAR的單個應用程序服務器實例。第一個EAR使用遠程EJB接口從第二個EAR調用EJB。單個應用程序服務器實例中單獨應用程序內的EJB本地/遠程接口

傳言即使調用是使用遠程接口實現的,應用程序服務器也知道一切都在同一個JVM中,並且在內部使用遠程接口和本地接口機制,即它不通過RMI調用方法,不打開任何套接字,也不會序列化/反序列化對象。

這是真的嗎?如果有人對此問題有關於Weblogic 10.3.2和OC4j 10.1.3的行爲的反饋,將會非常感激。

回答

1

不,這是不正確的。如果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

相關問題