2015-07-03 3 views
0

Я изучаю понимание EJB-поиска и пытаюсь понять, как работает контейнер и пул. Я создал тестовое приложение, каждое из которых я объясню.Внутри EJB lookup: constructor, @PostConstruct

Первая реализация: Lookup внутри конструктора

@Stateless 
    public class EjbTest { 

    protected EjbInjectedLocal  ejbInjected; 

    public EjbTest() { 
      InitialContext ic = new InitialContext(); 
      ejbInjected = (EjbInjectedLocal)ic.lookup("java:comp/env/ejb/EjbInjected"); 
      ic.close(); 
    } 

    public void test() { 
     ejbInjected.callSomeMethod(); 
     return; 
    } 

} 

Инъекция выполняется внутри конструктора класса (плохая практика), но все работает. Конструктор извлекает прокси для EJB. Когда я вызываю метод test(), он выполняется правильно.

Второе осуществление: LookUp внутри @PostConstruct

@Stateless 
public class EjbTest { 

    protected EjbInjectedLocal  ejbInjected; 

    public EjbTest() { 
    } 

    @PostConstruct 
    public start() { 
      InitialContext ic = new InitialContext(); 
      ejbInjected = (EjbInjectedLocal)ic.lookup("java:comp/env/ejb/EjbInjected"); 
      ic.close(); 
    } 

    public void test() { 
     ejbInjected.callSomeMethod(); 
     return; 
    } 

} 

В качестве предварительного Например, поиск работает хорошо, а испытание метода.

Третья реализация: Lookup внутри конструктора и функции исполнения

@Stateless 
public class EjbTest { 

    protected EjbInjectedLocal  ejbInjected; 

    public EjbTest() { 
      InitialContext ic = new InitialContext(); 
      ejbInjected = (EjbInjectedLocal)ic.lookup("java:comp/env/ejb/EjbInjected"); 
      ejbInjected.callSomeMethod(); 
      ic.close(); 
    } 

} 

С этой реализации, поиск работает, но функция привал/заморозить нить, как контейнер еще не готов к возвращению НЕ реализация прокси, но весь EJB и функция не могут быть выполнены.

Когда вызывающий конструктор вызывается, компонент еще не инициализирован и никакие зависимости не вводятся? Возвращается только прокси, но он еще не доступен и не может быть извлечен из EJB всего пула?

ответ

2

От EJB specification (4.3.10.2):

Поскольку случаи сессионный фасоли, как правило, объединяются, время призывания клиента метода создания не нужно иметь каких-либо прямое отношение к вызову контейнера метода PostConstruct/ejbCreate для экземпляра сессионного компонента без состояния.

Это специфичное для контейнера поведение, спецификация оставляет его открытым как область, в которой разработчики могут внедрять инновации. Реализации даже не требуется использовать боб бассейн, и любое поведение отложенной загрузки и точные бобы последовательности становятся доступны до контейнера, как конфигурация они предлагают своим пользователям, например:

http://docs.jboss.org/ejb3/docs/reference/1.0.7/html/SessionBean_and_MDB_configuration.html

О последовательности вызовов во время создания экземпляра в спецификации (раздел 4.3.10) указано:

Контейнер создает экземпляр сеансового компонента следующим образом.Во-первых, контейнер вызывает метод newInstance класса bean, чтобы создать новый экземпляр bean-компонента . Во-вторых, контейнер выполняет любую инъекцию зависимостей , как указано аннотациями метаданных в классе bean или дескриптором развертывания. Это включает в себя бонусный SessionContext, если применимо. В-третьих, контейнер вызывает методы перехватчика обратного вызова PostConstruct для компонента bean, если any. Дополнительные шаги, описанные ниже, применяются, если секция сеанса - , вызванная через API-интерфейсы API-интерфейса EJB 2.1.

В частности, любые введенные пользователем зависимости (например, с использованием аннотаций EJB) в этот момент будут пустыми. Используя InitialContext, вы обошли это ограничение, и это является причиной неожиданного поведения.

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

0

Только прокси возвращается, но он еще недоступен и не может быть извлечен из EJB из пула?

Это правильно. Вы просто забудете себя здесь.

+0

Вызывается метод EjbTest(), прокси EJB доступен, но EjbTest EJB еще не готов, пока не вызывается метод @PostConstruct (после выполнения конструктора класса). Но несколько раз третий пример прекрасно работает. Это просто вопрос завершения задачи времени? – StarsSky

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