Stateful EJBs в веб-приложении?
Я никогда не использовал stateful EJB. Я понимаю, что EJB с состоянием может быть полезен с Java-клиентом.
Но мне интересно: в каком случае их использовать в веб-приложении? И как? Должны ли мы поместить эти bean-компоненты с состоянием в Session (из-за http без состояния)?
Это хорошая практика? (не обсуждая слишком много о сохранении состояния без сохранения состояния)
1 ответ
Забавно, это второй вопрос по SFSB и веб-приложению в течение дня, хотя эта тема обычно не так часто встречается.
в каком случае использовать их в веб-приложении?
Традиционным примером SFSB и веб-приложения является корзина покупок. Но в то же время вы можете сделать то же самое с HttpSession
,
В идеале, если состояние относится к бизнес-логике, а не к логике представления, оно должно передаваться в SFSB. Но на практике люди обычно выступают против SFSB (из-за сложности, которую он вводит), если они не предоставляют то, что вы не можете легко сделать с HttpSession
, Большую часть времени вы можете настроить дизайн для хранения информации в HttpSession
или базу данных и передать ее, без необходимости иметь SFSB. Но в конечном итоге это вопрос чистоты дизайна.
И как? Должны ли мы поместить эти bean-компоненты с состоянием в Session (из-за http без состояния)?
Модель EJB является более богатой моделью, чем HttpSession
потому что EJB являются транзакционными компонентами, и существуют явные обратные вызовы для пассивации и активации SFSB. Это повышает сложность правильного использования SFSB, в частности (1) обработку исключений и (2) параллелизм и (2) удаление и тайм-аут SFSB. Смотрите мои ответы здесь для более подробной информации:
- Java: отслеживание сеанса входа пользователя в систему - EJB-сеанс против HTTPSession
- Правильное использование Stateful Beans с сервлетами
Если вы хотите их использовать, вам сначала нужно найти SFSB, чтобы получить ссылку на один свежий удаленный экземпляр. Затем вам нужно будет хранить эту ссылку где-то таким образом, чтобы повторно использовать ее в запросах. Это где-то обычно HttpSession
Это означает, что даже если вы используете SFSB, вы не сможете полностью от него избавиться.
С EJB2 удаленная ссылка - называемая дескриптором - может быть сериализована для повторного использования позже. Тогда было возможно сохранить, например, в базе данных, хотя я никогда не видел это. Я не знаю, возможно ли это с EJB3.
Это хорошая практика?
Как я уже сказал, люди обычно советуются против этого, если вы не знаете точно, почему вы будете их использовать, а не HttpSession
и только если вы хорошо владеете моделью EJB. (SFSB может быть оправдан, например, если бизнес-сервис доступен через веб-интерфейс и клиент для настольных компьютеров) У многих других фреймворков нет ничего похожего на SFSB, и людям все еще удается создавать с ними отличные приложения.
PS: я использовал SFSB в веб-приложении, и это действительно может быть сложнее, чем HttpSession
, но в конечном итоге это сработало.