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