2010-04-27 15 views
6

Założono pojedynczą instancję serwera aplikacji z dwoma wdrożonymi pakietami EAR. Pierwsza EAR wywołuje EJB z drugiego EAR przy użyciu zdalnych interfejsów EJB.EJB Interfejs lokalny/zdalny w osobnych aplikacjach w instancji pojedynczego serwera aplikacji

Mówi się, że nawet jeśli wywołanie jest realizowane za pomocą zdalnych interfejsów, serwer aplikacji wie, że wszystko znajduje się w obrębie tej samej maszyny JVM i wewnętrznie korzysta z interfejsu zdalnego z lokalną mechaniką interfejsu, a mianowicie, że nie wywołuje metod poprzez RMI, nie nie otwiera żadnych gniazd i nie szereguje/deserializuje obiektów.

Czy to prawda? Jeśli ktoś ma opinię na temat zachowania Weblogic 10.3.2 i OC4j 10.1.3 w odniesieniu do tego problemu, byłoby to bardzo cenne.

Odpowiedz

1

Nie, to nieprawda. Jeśli ORB zaimplementuje optymalizację lokalnego obiektu (czasami "obiekty kolokowane"), to nie otworzy żadnych gniazd, ale wykona serializację/deserializację, co jest zwykle szybsze niż zestawienie. Dodatkowe kopie obiektów są tworzone w celu uniknięcia naruszenia modelu programowania.

Wygenerowane stuby umożliwiają tę optymalizację. Oto przykład interfejs:

public interface a extends Remote { 
    public ArrayList test(ArrayList in1, ArrayList in2) throws RemoteException; 
} 

tutaj jest wynikiem rmic -iiop -Trzymaj a:

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); 
     } 
    } 
} 

Kiedy stub jest podłączony do lokalnej obiektu, wywołuje ObjectImpl._servant_preinvoke do zlokalizowania sługa (opakowanie EJB w twoim przypadku) w obrębie tej samej maszyny JVM. Następnie tworzy kopię argumentów wejściowych (symulowanie zestawiania), wywołuje metodę i tworzy kopię obiektu wynikowego (ponownie symulując zestawienie).

Nie jestem ekspertem od WebLogic. To powiedziawszy, ten dokument implikuje, że WebLogic wykonuje optymalizację obiektów kolokowanych:

http://download.oracle.com/docs/cd/E13222_01/wls/docs61/cluster/object.html#1007328