2010-04-27 4 views
6

Supposons une seule instance de serveur d'applications sur laquelle deux fichiers EAR sont déployés. Le premier fichier EAR appelle les EJB du second fichier EAR à l'aide d'interfaces EJB distantes. On prétend que même si l'invocation est implémentée à l'aide d'interfaces distantes, le serveur d'applications sait que tout est dans la même JVM et utilise en interne l'interface distante avec la mécanique d'interface locale, à savoir qu'elle n'appelle pas de méthodes via RMI. n'ouvre aucune socket et ne sérialise/désérialise pas les objets.EJB Interface locale/distante dans des applications distinctes dans une seule instance de serveur d'applications

Est-ce vrai? Si quelqu'un a des commentaires sur le comportement de Weblogic 10.3.2 et OC4j 10.1.3 concernant ce problème, il serait très apprécié.

Répondre

1

Non, ce n'est pas vrai. Si l'ORB implémente l'optimisation de l'objet local (parfois des "objets colloqués"), il n'ouvrira aucune socket, mais effectuera une sérialisation/désérialisation, ce qui est généralement plus rapide que le marshalling. Les copies d'objet supplémentaires sont faites pour éviter de violer le modèle de programmation.

Les talons générés permettent cette optimisation. Voici une interface exemple:

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

Voici le résultat 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); 
     } 
    } 
} 

Lorsqu'un talon est connecté à un objet local, il appelle ObjectImpl._servant_preinvoke de localiser un Serveur (un wrapper EJB dans votre cas) dans la même JVM. Ensuite, il fait une copie des arguments d'entrée (en simulant le marshalling), appelle la méthode, et fait une copie de l'objet résultat (simulant à nouveau le marshalling).

Je ne suis pas un expert WebLogic. Cela dit, ce document implique que WebLogic effectue l'optimisation de l'objet colocalisé:

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

Questions connexes