Если EJB выставил интерфейс @Remote, но вы внедрили EJB-компонент вместо его Удаленного интерфейса, это вызовет удаленный или локальный вызов? - PullRequest
4 голосов
/ 25 июля 2011

У меня EJB-компонент, который работает с двумя интерфейсами, как показано ниже: Локальный интерфейс - для моего веб-приложения, а Удаленный интерфейс - для моего клиента приложения

@Stateless
public class CoreMainEJB implements CoreMainEJBRemote, CoreMainEJBLocal {
    //...
}

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

public class Main {
   @EJB
   private static CoreMainEJBRemote coreEJBRemote;

   public static void main(String[] args) {
        coreEJBRemote.process(args[0]);       
   }
}

Из моего веб-приложения я вызываю, как показано ниже.В этом случае происходит локальный вызов метода

@ManagedBean
@RequestScoped
public class DisplayInbound {
    @EJB
    private CoreMainEJBLocal coreMainEJBLocal;

    public void processPackages() {
        coreMainEJBLocal.process(...);   
    }
}

Итак, вот мой вопрос, Если EJB-компонент предоставляет только интерфейс @Remote, но в вашем веб-приложении вы вставляете EJB-компонент непосредственно вместо егоУдаленный интерфейс, будет ли это запускать удаленный или локальный вызов? Например:

@Stateless
public class CoreMainEJB implements CoreMainEJBRemote{
    //...
}

, а в веб-приложении я делаю это

@EJB
private CoreMainEJB coreMainEJB;

public void processPackages() {
    coreMainEJB.process(...);   //Is this local or remote invocation here?
}

Ответы [ 2 ]

5 голосов
/ 26 июля 2011

Последний приведенный пример просто не будет работать.Поскольку CoreMainEJB уже реализует удаленный интерфейс, контейнер не создает представление без интерфейса.Это как раз тот случай, для которого предназначен @LocalBean.

Итак, чтобы ответить на вопрос ' Это локальный или удаленный вызов здесь? ' напрямую: это ни то, ни другое.Контейнер не сможет внедрить что-либо и, вероятно, прервется на этапе развертывания.

Если вы определите свой компонент как:

@Stateless
@LocalBean
public class CoreMainEJB implements CoreMainEJBRemote{
    //...
}

Тогда здесь будет применяться локальная семантика:

@EJB
private CoreMainEJB coreMainEJB;

public void processPackages() {
    coreMainEJB.process(...);   // Local semantics
}

(при условии, что приведенный выше фрагмент кода находится в том же приложении, где определено CoreMainEJB, конечно)

4 голосов
/ 25 июля 2011

Неинтерфейсный вызов является локальным.

...