Я очень плохо знаком с Java EE и пытаюсь понять концепцию локальных интерфейсов и удаленных интерфейсов.
В начальных версиях спецификации EJB EJB-компоненты «предполагались» как удаленные компоненты, и единственный способ вызвать их состоял в том, чтобы сделать удаленный вызов, используя семантику RMI и все накладные расходы, которые это подразумевает (сетевой вызов и сериализация объекта для каждого вызов метода). Клиенты EJB должны были платить штраф за производительность, даже если они размещены на одной виртуальной машине с контейнером EJB.
Позже Sun осознал, что большинство бизнес-приложений на самом деле не распределяют EJB-компоненты на другом уровне, и они исправили спецификацию (в EJB 2.0), представив концепцию локальных интерфейсов, чтобы клиенты, расположенные в одной виртуальной машине с контейнером EJB, могли вызывать EJB-компоненты с помощью прямой вызов метода, полностью обходя семантику RMI (и связанные с этим издержки).
Мне сказали, что одним из больших преимуществ Java EE является то, что его легко масштабировать (что, я считаю, означает, что вы можете развертывать различные компоненты на разных серверах)
Java EE может масштабироваться, но это не обязательно означает распределение компонентов. Вы можете запустить приложение Web + EJB в кластере, не разделяя веб-уровень и уровень EJB.
Предполагается ли использовать удаленные интерфейсы, если вы ожидаете, что ваше приложение будет иметь разные компоненты на разных серверах? И использовать локальные интерфейсы, если ваше приложение будет находиться только на одном сервере?
Я бы сказал так: используйте удаленные интерфейсы, если клиент не находится в той же JVM (это не означает, что используется только один сервер / JVM).
(...) Начать с использования локальных интерфейсов и постепенно обновлять до удаленных интерфейсов, где это применимо?
Я бы, наверное, начал с использования локальных интерфейсов. И, как уже было сказано, переключение на удаленные интерфейсы не всегда обязательно (вы можете кластеризовать объединенную структуру).
Я предлагаю проверить ресурсы, упомянутые ниже (2 первых довольно старые, но все еще актуальны, 2 других более поздние).
Ресурсы
It seems like there are a couple ways of scaling a web application (...) and I suppose you could use a combination of both?
Да, это именно так.Do you, by chance know of good books on this topic?
К сожалению, нет, я не знаю абсолютного ресурса "ZE", если он есть. Я добавил больше ресурсов с некоторыми ссылками, хотя.Хотя я согласен с большей частью того, что написано выше, я хотел бы немного уточнить идеи «как начать».
Я предлагаю вам никогда не программировать напрямую на интерфейсы EJB в вашем коде. Всегда используйте обычный бизнес-ориентированный интерфейс, программируйте его (имеется в виду, используйте методы вызова кода в бизнес-ориентированном интерфейсе) и предоставляйте «склеивающий» код EJB как подключаемую реализацию. Ваша программа должна быть ориентирована на бизнес-логику, а не на детали реализации, такие как EJB.
Таким образом, вы можете легко переключаться между удаленной и локальной реализациями - и если вы используете контейнер IoC, такой как Spring, вы можете сделать это только с помощью конфигурации.
Особое примечание о переключении с локального на удаленное: обратите внимание, что между ними есть несколько семантических различий. Например, вызов метода EJB через его «удаленный интерфейс» приводит к тому, что аргументы передаются по значению, а при вызове через «локальный интерфейс» аргументы передаются по ссылке. Это серьезное различие; поэтому, если вы «начинаете с локального», убедитесь, что вы проектируете свою систему так, чтобы она учитывала и «удаленную» семантику.
Если ваш дизайн опирается на методы EJB, изменяющие переданные объекты, тогда вам будет сложно «переключиться на удаленный» позже; возможно даже невозможно.
Удачи.
источник
Согласно спецификации EJB 3.2 EJB может быть локальным или удаленным . Бизнес-интерфейс не может быть одновременно локальным и удаленным.
@Local
Доступ к аннотированным компонентам возможен только в том случае, если они находятся в одном приложении.@Remote
аннотированные bean-компоненты могут быть доступны в разных приложениях, находящихся в разных jvms или на серверах приложений.Поэтому важно помнить следующее:
@Remote
аннотацию, то все реализованные интерфейсы должны быть удаленными.@Local
аннотация указана, то все реализованные интерфейсы предполагаются локальными.источник
@Local
для вызова EJB в другом приложении (JAR, WAR, EAR), но в той же JVM?Это может ответить на ваши проблемы:
Источник: http://www.onjava.com/pub/a/onjava/2004/11/03/localremote.html?page=last&x-showcontent=text
источник