EJB Локальный/Удаленный интерфейс в рамках отдельных приложений в единственном экземпляре сервера приложений

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

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

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

6
задан yannisf 27 April 2010 в 12:53
поделиться

1 ответ

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

1
ответ дан 17 December 2019 в 22:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: