Примите единственный экземпляр сервера приложений, который имеет два развернутые УХА. Первый EAR вызывает EJBs от второго EAR с помощью удаленных интерфейсов EJB.
Известно по слухам, что, даже если вызов реализован с помощью удаленных интерфейсов, сервер приложений знает, что все в той же JVM и внутренне использует удаленный интерфейс с локальной интерфейсной механикой, а именно, это не называет методы через RMI, не открывает сокетов и не сериализирует/десериализовывает объекты.
Действительно ли это верно? Если бы у кого-либо есть обратная связь на поведении Weblogic 10.3.2 и OC4j 10.1.3 относительно этой проблемы, это очень ценилось бы.
Нет, это не так.Если 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