2014-01-30 4 views
-1

Я новичок в ejbs и cdi. По моему мнению, ejb с сохранением состояния хранит данные в переменных экземпляра и уничтожает состояние ejb после завершения запроса.Внедрение stateful ejb в сервлет

Недавно я посетил интервью, на котором интервьюер спросил меня, какой ejb я буду использовать в онлайн-магазине.

Если мне нужно сделать это без ejbs, я создаю HttpSession, а затем добавлю интерес пользователей к сеансу, а затем покажу ему еще одну страницу, чтобы продолжить или сделать платеж или выйти.

Если я хочу выполнить то же самое с использованием stateful ejbs, я не понимаю, почему я должен использовать stateful ejbs, каково его значение? Поскольку после завершения запроса ejb уничтожается, и пользовательский интерес/детали корзины уничтожаются.

Во-вторых, что я не могу понять о cdi, предположим, что я вставляю класс службы в свой сервлет, потому что инъекция происходит только один раз, когда будет только один экземпляр класса службы. Когда приходит более двух запросов, переменные экземпляра stateful ejb становятся поврежденными. Поэтому, я думаю, когда я использую stateful ejbs, я должен использовать аннотацию @RequestScoped. Я прав?

ответ

3

Состоящий из сеанса сеанс позволит вам сохранить такое же состояние, как и сеанс http. Несколько преимуществ по сравнению с использованием HTTP сессии, что я могу думать:

  1. Масштабируемость - Ваш SFSB может быть развернут на другом сервере и масштабировать независимо друг от друга с помощью удаленных интерфейсов
  2. Non-веб-клиентов - Вы можете использовать SFSB для сохранения состояния для не-веб-клиент, где HTTP сессия не будет доступна
  3. other benefits, которые приходят с использованием EJB

Чтобы держать ссылку на отслеживанием состояния EJB в сервлет, вы должны использовать @SessionScoped с @Inject, как указано в этом answer

+1

Крошечная ручка с этим в противном случае безупречным ответом: в -STATEFUL-EJB было бы очень плохой идеей (tm) сделать то же самое с безгосударственным EJB. – Gimby

+0

Ссылки помогли. У меня есть вопрос. Что делать, если я хочу уничтожить сессионный компонент с состоянием. Например, я могу использовать 'httpSession.invalidate()' для уничтожения/удаления/уничтожения сеанса. Предположим, что клиент купил или вышел сейчас, я хочу удалить сессионный компонент с состоянием. Как я могу это сделать? –

+0

Вы можете вызвать метод, аннотированный с помощью @Remove. Однако я не уверен, что произойдет с ссылкой в ​​сервлете - дайте мне знать результат, если вы попробуете это :) – 6ton

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