2013-02-19 3 views
3

Я простой боб объявлен следующимРешения вернуться Local или Remote

@Local(LocalInt.class) 
@Remote(RemoteInt.class) 
@Stateless(name="name") 
public MyEJB_Implementation { 
    //methods 
} 

Как вы можете видеть, это один боб, который имеет локальный интерфейс (для локальных клиентов) и удаленный интерфейс (для удаленные).

клиенты (удаленные и локальные) получить экземпляр следующим образом:

ctx = new InitialContext(environment); 
ctx.lookup("name"); 

Как Контейнер решить, если он поставит прокси, реализующий интерфейс LocalInt или интерфейс RemoteInt? (поскольку я использую то же самое «имя» для поиска).

Я имею в виду, что реестр JNDI как-то знает, выполняется ли поиск в той же JVM или с удаленного сервера?

А также разве это различие (для локальных и удаленных вызовов) сталкивается с семантикой «поиска»? (который должен иметь ровно ноль или один объект, зарегистрированный для одного имени, в этом случае, похоже, есть 2 объекта (локальные и удаленные) под тем же именем).

спасибо.

ответ

3

По моему опыту контейнер вернет интерфейс local, когда клиенты находятся в одном контейнере (EAR или WAR), и когда за его пределами будет возвращен интерфейс remote.

Я не уверен, что это указано в качестве требования в спецификации Java EE, но почти все стандартные контейнеры ведут себя таким образом (опять же, по моему опыту)

+0

Спасибо. Да, это результат, но меня интересует механизм, я делаю поиск, который возвращает другой объект, основанный на том, что он исходит из того же JVM или удаленного ... не должно быть основано JNDI просто в именах? – edutesoy

1

Контейнер EJB будет связывать локальные и удаленные интерфейсы отличные имена JNDI, поэтому зависит от того, на какой из них вы смотрите. Например, в EJB 3.1 стандартное место привязки будет примерно таким:

java:app/YourEJBModule/YourEJBName!com.your.pkg.LocalInt 
java:app/YourEJBModule/YourEJBName!com.your.pkg.RemoteInt 
+0

Спасибо за ваш ответ. Я вижу вашу точку зрения, но в коде я делаю ручной поиск с именем «имя» (как для удаленного, так и для локального), как контейнер (реестр JNDI, в данном случае) знает, если я нахожусь в одной JVM или в удаленном, чтобы выбрать LocalInt или RemoteInt? – edutesoy

+0

Не знаю. Возможно, сервер приложений возвращает объект, который для удобства использует все интерфейсы? Какой сервер приложений вы используете? Предположим, что 'o = ctx.lookup (...)', что делает 'o.getClass()' и 'java.util.Arrays.toString (o.getClass(). GetInterfaces())' return? –

0

Jndi очень контекстуальный. Даже если вы думаете, что используете абсолютные имена, они часто относятся к текущему компоненту, из которого вы выполняете поиск.

Я удивлен, что работает «имя». Это фактически предназначено для другого пространства имен (не JNDI).

+0

Интересно, вы имеете в виду, что JNDI ведет себя по-разному в зависимости от вызывающего? это совсем не так, как работают другие службы именования (DNS, файловая система ...) ... у меня есть сомнения, я немного проверял, и я не видел никаких ссылок на это поведение ... у вас его есть? Спасибо! – edutesoy

+0

Файловые системы также имеют понятие относительных путей. Ваше местоположение в дереве определяет результат слова «cd foo». Например, «java: comp» разрешает частное дерево JNDI компонента (последний в стеке). Например, с фасолью A и B, выполнение поиска для «java: comp/env/foo» может вернуть другую вещь при вызове из кода внутри A vs B. Даже «хуже», вызывая java: независимо от удаленного JNDI-контекста, будет все еще разрешены локально и НЕ в удаленном месте, поскольку «java:» всегда указывает на локальный контекст. –

0

Спецификация EJB 3.1 в разделе 3 четко объясняет местное и дистанционное представление. В разделе 3.3.2 говорится

сессия фасоль может иметь местных клиентов. Локальным клиентом является клиент, который размещен в одном JVM с сеансовым компонентом, который предоставляет локальный клиентский вид и который может быть тесно связан с компонентом. A локальным клиентом сеансового компонента может быть другой корпоративный компонент или веб-компонент . Доступ к корпоративному компоненту через локальный клиентский вид требует, чтобы коллокация в той же самой JVM как локального клиента, так и - это корпоративный компонент, который обеспечивает представление локального клиента. Таким образом, локальный вид клиента не обеспечивает прозрачность местоположения , предоставляемую представлением удаленного клиента.Доступ к корпоративному компоненту через локальный клиент должен поддерживаться только для локальных клиентов , упакованных в том же приложении, что и компонент предприятия , который предоставляет представление локального клиента. Соответствующие реализации этой спецификации могут необязательно поддерживать доступ к локальному клиенту вид корпоративного компонента от локального клиента, упакованного в другое приложение .

Это должно объяснить поведение

+0

Да, но это не объясняет, что JNDI возвращает другой объект в зависимости от того, является ли вызывающий абонент локальным или удаленным. Предполагается ли, что JNDI ведет себя по-разному в зависимости от вызывающего? – edutesoy

Смежные вопросы