Нет, это не правда. Если ORB реализует локальную оптимизацию объектов (иногда «совместно расположенные объекты»), то он не открывает никаких сокетов, но выполняет сериализацию / десериализацию, которая обычно выполняется быстрее, чем маршаллинг. Дополнительные копии объекта сделаны, чтобы избежать нарушения модели программирования.
Сгенерированные заглушки позволяют эту оптимизацию. Вот пример интерфейса:
public interface a extends Remote {
public ArrayList test(ArrayList in1, ArrayList in2) throws RemoteException;
}
Вот результат команды 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);
}
}
}
Когда заглушка подключена к локальному объекту, она вызывает ObjectImpl._servant_preinvoke, чтобы найти слугу (EJB-обертку в вашем случае) в той же JVM. Затем он создает копию входных аргументов (имитирует маршаллинг), вызывает метод и создает копию объекта результата (снова имитирует маршаллинг).
Я не эксперт по WebLogic. Тем не менее, этот документ подразумевает, что WebLogic выполняет оптимизацию объединенных объектов:
http://download.oracle.com/docs/cd/E13222_01/wls/docs61/cluster/object.html#1007328