Могу ли я использовать EJB Stateless Bean с CDI для поддержки сеанса пользователя? - PullRequest
3 голосов
/ 13 июня 2011

Основано на этом посте http://www.adam -bien.com / roller / abien / entry / ejb_3_1_killed_the Я использую в своем приложении бин @Named @Stateless для связи с базой данных (впрыскивая EntityManager здесь) и отображаюИнформация на странице JSF.Это большое облегчение после Java EE 5, но у меня есть один вопрос.

Безопасно ли использовать такие компоненты для поддержки сеанса пользователя (корзина и т. Д.)?Я прочитал книгу об ejb 3.0 и знаю, что один и тот же bean-компонент без сохранения состояния можно использовать со многими клиентами.

Каков наилучший подход к использованию управляемого bean-компонента со всеми функциями ejb (транзакции, безопасность потоков и т. Д.)?Я имею в виду любой другой способ, кроме управляемого интерфейса bean + ejb с реализацией + внедрение ejb, как в Java EE 5?

Я использую GlassFish 3.1 WebProfile

Ответы [ 2 ]

10 голосов
/ 13 июня 2011

Добавление к совету duffymo; Есть некоторые дополнительные соображения по использованию bean-компонентов сеанса с сохранением состояния по сравнению с использованием сеанса HTTP.

Сеанс HTTP в основном имеет структуру, подобную карте. Он напрямую доступен для всех потоков (запросов), которые являются частью сеанса. Это делает манипулирование несколькими предметами относительно небезопасным действием. Можно выполнить синхронизацию в самом сеансе, но это рискованная операция, которая может привести к полной блокировке всего приложения. Сеанс HTTP позволяет объявлять прослушиватели событий, которые запускаются при любых изменениях сеанса http.

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

Там, где обычно есть только один http-сеанс на пользователя, один пользователь может одновременно использовать несколько сессионных компонентов с состоянием. Особое преимущество сессионных компонентов с сохранением состояния заключается в том, что у них есть механизм пассивации своего состояния после некоторого времени ожидания, который может освободить память вашего сервера (разумеется, за счет дискового пространства). Сессионные компоненты с сохранением состояния не имеют напрямую таких слушателей событий, как сеанс http.

Я думаю, что изначально «сессионный» аспект сессионных компонентов с состоянием состоял в том, чтобы поддерживать сеанс с удаленными не веб-клиентами (Swing, другой AS и т. Д.). Это очень похоже на сеанс http, созданный для поддержки сеанса с удаленными веб-клиентами. Поскольку не-веб-клиент может запрашивать и поддерживать несколько прокси-серверов для сеансовых компонентов с сохранением состояния, веб-аналогия на самом деле больше похожа на недавно введенную conversation scope.

В случае, когда удаленные веб-клиенты общаются с сервером, где сервер внутренне общается с сессионным компонентом с состоянием, понятия сильно перекрывают . Удаленный веб-клиент знает только о сеансе http (через JSESSIONID) и ничего не говорит о сеансе сессионного компонента с состоянием. Таким образом, если сеанс http был потерян, вы, как правило, не сможете снова подключить удаленный клиент к определенному компоненту сеанса с сохранением состояния. Таким образом, в этом случае HTTP-сеанс всегда является ведущим, и вы можете также хранить элементы корзины покупок внутри одного (http) компонента в области сеанса.

Существует один конкретный случай, когда сессионные компоненты с сохранением состояния пригодятся для внутренней коммуникации, и это если вам нужны JPA extended persistence context. Это можно использовать, например, если блокировки между сущностями должны продолжаться между запросами (что, возможно, удобно для корзины покупок, если у вас ограниченный запас и вы не хотите сообщать пользователю сообщение «нет в наличии», как только он фактически выписывается).

6 голосов
/ 13 июня 2011

Бобы без состояния не могут поддерживать корзины или сеанс;это то, что означает «без состояния».

Вам нужен либо EJB с состоянием, либо сделать это на веб-уровне.Это единственные места, где поддерживается сессия.

...