2010-04-27 10 views
6

Supongamos una sola instancia del servidor de aplicaciones que tiene dos EAR desplegados. El primer EAR invoca los EJB del segundo EAR usando interfaces EJB remotas.Interfaz Local/Remota de EJB en aplicaciones separadas en una única instancia del servidor de aplicaciones

Se rumorea que incluso si la invocación se implementa utilizando interfaces remotas, el servidor de aplicaciones sabe que todo está dentro de la misma JVM y utiliza internamente la interfaz remota con la mecánica de interfaz local, no llama a métodos a través de RMI. no abre ningún socket, y no serializa/deserializa los objetos.

¿Es esto cierto? Si alguien tiene comentarios sobre el comportamiento de Weblogic 10.3.2 y OC4j 10.1.3 con respecto a este tema, sería muy apreciado.

Respuesta

1

No, no es verdad. Si el ORB implementa la optimización de objetos locales (a veces "objetos coubicados"), no abrirá ningún socket, pero realizará la serialización/deserialización, que suele ser más rápido que ordenar. Las copias de objetos adicionales están hechas para evitar violar el modelo de programación.

Los stubs generados permiten esta optimización. Aquí es una interfaz ejemplo:

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

Este es el resultado de rmic -iiop -keep 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); 
     } 
    } 
} 

Cuando un trozo está conectada a un objeto local, llama ObjectImpl._servant_preinvoke para localizar una sirviente (un contenedor EJB en su caso) dentro de la misma JVM. A continuación, realiza una copia de los argumentos de entrada (simulando la clasificación), llama al método y realiza una copia del objeto de resultado (simulando de nuevo la clasificación).

No soy un experto de WebLogic. Dicho esto, este documento implica que WebLogic realiza la optimización de objeto coubicado:

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

Cuestiones relacionadas