2013-11-08 2 views
4

Если у нас есть фасонный элемент, то он может быть введен в сервлет с помощью аннотации @EJB. Например:EJB-инъекция против поиска из контекста в сервлете

@Stateless 
public class LongTimeService { 
    public void do() { 
     //logic 
    } 
} 

public class ServletWithBean extends HttpServlet { 
    @EJB 
    private LongTimeService bean; 

    @Override 
    public void service(ServletRequest arg0, ServletResponse arg1) 
     throws ServletException, IOException { 
      bean.do; 
      ... 
    } 
} 

В этом случае мы будем иметь только один экземпляр LongTimeService боб на протяжении всего жизненного цикла сервлета. С точки зрения контейнера ejb, когда веб-контейнер будет строить Servlet с bean-компонентом, он запрашивает экземпляр из контейнера ejb и будет хранить этот экземпляр до тех пор, пока сервлет не будет уничтожен, и каждый запрос сервлета будет работать только с одним экземпляром. Я думаю, что это плохой способ использования Statless EJB, потому что он не создается для такого использования. Для этого perpes, например, полезный факсимильный компонент @Singleton. Но если мы хотим использовать фасовую фагу, то мы можем искать экземпляр этого компонента из контекста каждый раз внутри метода.

public class ServletWithBean extends HttpServlet { 

    @Override 
    public void service(ServletRequest arg0, ServletResponse arg1) 
     throws ServletException, IOException { 
     Context ctx = new InitialContext(); 
     LongTimeService bean = context.lookup("LongTimeService"); 
      bean.do; 
      ... 
    } 
} 

Правильно ли и можно использовать этот подход?

ответ

4

С контейнера EJB перспективы, когда веб-контейнер будет построить сервлет боба это спросить экземпляр из контейнера EJB и будет держать этот экземпляр, пока сервлет не будет destroed и каждый сервлет запрос будет работать только с одним экземпляром.

Правильное обоснование, однако, экземпляр, который вводится в член класса сервлета, фактически является экземпляром объекта, называемого Stub или Proxy, на самом деле это не экземпляр EJB.

В принципе, каждый раз, когда вы вызываете метод ejb's из вашего сервлета, Stub запрашивает контейнер ejb ссылкой на ejb, контейнер получает доступный ejb из пула, этот ejb будет обрабатывать запрос и один раз работа будет завершена, она вернется в бассейн.

Следовательно, если ваш сервлет обрабатывает несколько запросов одновременно, заглушка получит другую ссылку ejb для каждого запроса.

Обратите внимание, что реализация объекта-заглушки должна быть потокобезопасной (а для фасов без атак - это).

Я думаю, что это плохой способ использования Statless EJB, потому что th не создает для такого использования.

В соответствии с вышеуказанными пунктами, да, вы можете использовать инъекцию @EJB из сервлета.

О перекодировках тупикового подхода:

Она также может работать (вы получите Stub каждого запроса), но это не является необходимым для лиц без гражданства и он имеет существенный недостаток: что поиск является операцией отнимает много времени, поэтому вы получите задержку в ответе на время без компенсации.

Я надеюсь, что это поможет вам.

+0

Хороший ответ, очень ясно. –

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