Как мне вызвать удаленный EJB в EAR из другого?

Как в Weblogic 10.3 внедрить удаленный EJB из одного EAR в bean-компонент без сохранения состояния другого, при этом оба EAR развернуты в одном контейнере? В идеале я хотел бы сделать как можно больше с аннотациями.

Итак, предположим, что у меня есть следующий интерфейс:

public interface HelloService {
  public String hello();
}

реализуется следующим компонентом EJB:

@Stateless
@Remote
public class HelloServiceBean implements HelloService {
  public String hello() {
      return "hello";
  }
}

Предположим, что они упакованы и развернуты в server.ear. Теперь в client.ear у меня есть следующее:

@Stateless
public class HelloClientBean {
    @EJB
    HelloService helloService;

// other methods...
}

Что мне нужно добавить, чтобы Weblogic правильно вычислил проводку между HelloClientBean в client.ear и HelloServiceBean в server.ear? Приветствуются ссылки на официальные документы и/или книги.


person lindelof    schedule 01.03.2010    source источник
comment
Бесстыжая шишка. Все, что я понял до сих пор, это то, что Weblogic свяжет bean-компонент без состояния, аннотированный @Stateless(mappedName=foo) с foo#full.qualified.interface.name в JNDI. Но как мне тогда аннотировать мое поле helloService в HelloClientBean?   -  person lindelof    schedule 03.03.2010


Ответы (1)


Самое простое решение, которое я нашел до сих пор, заключается в следующем.

Во-первых, аннотируйте bean-компонент без сохранения состояния атрибутом mappedName:

@Stateless(mappedName="HelloService")
@Remote
public class HelloServiceBean implements HelloService {
  public String hello() {
      return "hello";
  }
}

Согласно http://forums.oracle.com/forums/thread.jspa?threadID=800314&tstart=1, Weblogic никогда не создаст запись JNDI для EJB, если имя JNDI не указано в качестве атрибута mappedName (или в дескрипторе развертывания, или в собственной аннотации).

Теперь вы можете аннотировать поле клиента с помощью @EJB с атрибутом mappedName, который должен быть таким же, как атрибут в компоненте сервера. (Я, честно говоря, сбит с толку этим. Weblogic 10.3 предлагает использовать синтаксис mappedName#interfaceName, но в моих тестах это не работает.):

@Stateless
public class HelloClientBean {
    @EJB(mappedName="HelloService")
    HelloService helloService;

// other methods...
}

Теперь это работает, если оба EAR развернуты в одном контейнере. Далее я попытаюсь выяснить правильный синтаксис, когда они развернуты на разных машинах.

person lindelof    schedule 03.03.2010
comment
Использование именования полезно и работает нормально, но не подходит для настройки. Любое изменение конфигурации повлияет на ваш код. Конфигурация EJB jar xml или некоторая инъекция/проксирование конфигурации при запуске через CDI сделают то же самое, но также позволят вам параметризовать ее, повышая возможности обслуживания и развертывания. - person kij; 06.06.2015
comment
Компоненты EJB, использующие сопоставленные имена, могут быть непереносимыми. - person Jorge Nunez Newton; 16.02.2016
comment
Скорее всего, приложения, разработанные в одном проприетарном контейнере, никогда не будут перенесены на другой бренд (поскольку они склонны использовать расширения этих контейнеров). Это старая дилемма: переносимость является требованием для одних классов систем, а не для других. - person luis.espinal; 30.12.2018