Локальный / удаленный интерфейс EJB в отдельных приложениях в одном экземпляре сервера приложений - PullRequest
6 голосов
/ 27 апреля 2010

Предположим, что один экземпляр сервера приложений имеет два развернутых EAR. Первый EAR вызывает EJB из второго EAR с использованием удаленных интерфейсов EJB.

Ходят слухи, что даже если вызов реализован с использованием удаленных интерфейсов, сервер приложений знает, что все находится в одной JVM, и внутренне использует удаленный интерфейс с механикой локального интерфейса, а именно он не вызывает методы через RMI, открывать любые сокеты и не сериализовать / десериализовывать объекты.

Это правда? Если у кого-то есть отзывы о поведении Weblogic 10.3.2 и OC4j 10.1.3 в отношении этой проблемы, это будет высоко оценено.

1 Ответ

1 голос
/ 27 апреля 2010

Нет, это не правда. Если 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

...