Если EJB предоставляет интерфейс @Remote, но вы вставляете компонент EJB вместо его интерфейса Remote, вызовет ли это удаленный или локальный вызов?

У меня есть компонент 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 напрямую вместо его интерфейса Remote, вызовет ли это удаленный вызов или локальный вызов? Например:

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

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

@EJB
private CoreMainEJB coreMainEJB;

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

person Thang Pham    schedule 25.07.2011    source источник


Ответы (2)


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

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

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

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

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

@EJB
private CoreMainEJB coreMainEJB;

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

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

person Arjan Tijms    schedule 25.07.2011
comment
Прости. Я был занят другим проектом, поэтому отвечаю немного поздно. Большое Вам спасибо. - person Thang Pham; 27.07.2011

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

person Petar Minchev    schedule 25.07.2011
comment
хехе.. это то, что я хочу услышать. Спасибо - person Thang Pham; 25.07.2011
comment
Именно поэтому они добавили аннотацию @LocalBean в EJB 3.1. - person TC1; 25.07.2011
comment
@TC1: Если вы посмотрите на мой код, у меня не было @LocalBean в моем EJB, и именно поэтому я хочу подтвердить, является ли этот вызов локальным или удаленным вызовом. - person Thang Pham; 25.07.2011
comment
@Harry Pham Afaik, @LocalBean считается значением по умолчанию, если вы используете bean-компонент непосредственно в локальном контексте, как и во многих других случаях в JEE6, это еще один пример конфигурации за исключением. Обратите внимание, например, как вы можете указать @EJB в интерфейсе, и Java сама найдет реализацию (если она недвусмысленна). На самом деле не хочу сейчас копаться в JSR для цитаты по @LocalBean, и, честно говоря, мне все равно, чтобы делать это... - person TC1; 25.07.2011
comment
EJB 3.1, раздел 4.9.8: Если бин не предоставляет никаких других клиентских представлений (локальный, удаленный, без интерфейса, 2.x удаленный дом, 2.x локальный дом, веб-служба) и его предложение реализации пусто, бин определяет представление без интерфейса. [...] Следующие интерфейсы исключаются при определении того, предоставляет ли компонент представление без интерфейса: java.io.Serializable; java.io.Externalizable; любой из интерфейсов, определенных пакетом javax.ejb. - person Brett Kail; 25.07.2011
comment
›Вызов без интерфейса — это локальный вызов — это правда, но на самом деле он не отвечает на вопрос о фрагменте кода, так как там нет представления без интерфейса. - person Arjan Tijms; 26.07.2011