2014-09-25 5 views
2

При использовании Stateful EJB, как сервер знает, с кем связан EJB, если у клиента нет активного сеанса? Раньше я использовал stateless EJB, но теперь я пытаюсь узнать, как использовать stateful EJB. Я думал о том, чтобы реализовать свою корзину покупок как EJB с сохранением состояния, вместо того, чтобы иметь POJO Cart, которую я добавляю в качестве атрибута в сеансе пользователя. Но так как Stateful EJB явно не добавляется как атрибут в HttpSession, как сервер связывает клиента с EJB с состоянием?Stateful EJB vs. Session Attribute

+0

Сервер не может связать клиента с сессией, если он не был добавлен (или вы используете '@ Inject' и сессионного компонента является' @ SessionScoped'). Что создает впечатление, что это так? –

+0

Я думал, что с помощью stateful EJB, когда я делаю запрос на запуск метода в stateleful EJB, тот же компонент обслуживает один клиент, поэтому я не был уверен, что соединение было между компонентом и этим 1 клиентом. – user1154644

+0

Консоль сеанса состояния создается, когда клиент выполняет поиск. Прокси-сервер, который возвращается из поиска, содержит некоторый тип ссылки/идентификатора для конкретного экземпляра компонента, поэтому, когда клиент выполняет последующие вызовы прокси-сервера, он подключается к конкретному экземпляру компонента. –

ответ

1

EJB не имеет технически нуждается в, чтобы иметь доступ к JSESSION_ID клиента, поскольку, как и любое базовое pojo, он доступен и доступен, если вызывающий клиент жив. После вызова клиент будет уничтожен или иным образом передает управление SFSB, боб обязан пассивироваться или уничтожены (и, следовательно, «забывают» разговор)

От the Oracle JavaEE-6 tutorial

состояние сохраняется в течение продолжительность сеанса client/bean. Если клиент удаляет компонент, сеанс заканчивается, и состояние исчезает. Этот переходный характер государства не является проблемой, однако, потому что, когда разговор между клиентом и боб концов, нет никакой необходимости, чтобы сохранить государству

Думай об этом так же, как разжиться регулярного java-объекта в отношениях has-a: после того, как вы установили скомпилированный объект в null, вы в основном закончили свой разговор с этим объектом. То же самое применимо и здесь (вроде). Клиенту не нужно передавать конкретную информацию о сеансе в EJB. Обычный жизненный цикл EJB и аннотации (в частности, @Remove) заботятся обо всем остальном.

Предупреждение о SFSBs: они тяжеловесные и они дольше, чем SLSB. Не используйте их, если вам действительно не нужны полномасштабные атрибуты EJB. Во многих случаях достаточно простого HttpSession и SLSB.

Дальнейшее чтение

+0

Предупреждение не обязательно верно. Существуют шаблоны для работы с SFSB, которые позволяют масштабировать приложение, чтобы избежать кода котельной плиты и анемичных моделей, спровоцированных SLSB. Oracle doc говорит, чтобы не злоупотреблять SLSB, если у вас действительно есть * много * пользователей – Sergio