2014-10-14 2 views
1

Вот параграф из oracle blog, который я читал недавно.Являются ли состояния бобы управляемыми контейнером или приложением в EJB?

Такое поведение сильно отличается от поведения сессионных компонентов Stateful. Экземпляр экземпляра сеанса Stateful должен быть явно удален клиентом с вызовом метода, аннотированного с помощью @Remove. Контейнер не будет автоматически уничтожен; он не связан ни с каким контекстом. Если вы связываете сессионный компонент Stateful с HttpSession, вы также должны заботиться о его надежном уничтожении в конце или в тайм-ауте HttpSession.

В соответствии с этим, приложение должно удалить stateful session, когда это будет сделано с его помощью.

Но я прочитал в нескольких книгах, если @Remove не вызывается, контейнер по-прежнему удаляет компонент из области видимости, но по своему усмотрению.

, так что я хочу знать, что правильно? ли @stateful должны быть явно удалены или оставить его в контейнер, чтобы удалить, если вообще это делает удаление

EDIT

Цитирую Beginning Java EE7 by Antonio Goncalves - отличная книга; стр. 243 в pdf

Обратите внимание на необязательные аннотации @ javax.ejb.StatefulTimeout и @ javax.ejb.Remove. @Remove украшает метод checkout(). Это приводит к тому, что экземпляр компонента постоянно удаляется из памяти после вызова метода checkout(). @StatefulTimeout присваивает значение тайм-аута, которое является длительностью, в течение которой бин может оставаться бездействующим (не получая никаких клиентских вызовов) перед удалением контейнером. Единицей времени этой аннотации является java.util.concurrent.TimeUnit, поэтому он может перейти от DAYS, HOURS ... к NANOSECONDS (по умолчанию - MINUTES). В качестве альтернативы вы можете избежать этих аннотаций и полагаться на контейнер, автоматически удаляя экземпляр, когда сеанс клиента заканчивается или истекает. Тем не менее, убедитесь, что компонент состояния с удалением в подходящий момент может сократить потребление памяти. Это может иметь решающее значение для высококонкурентных приложений.

+0

Я интерпретирую то, что вы читали так: «Если вы не управляете SFSB сами, они накапливают, теряют память и создают беспорядок, который контейнер в конечном итоге попытается очистить ...» « – jahroy

+0

@ jahroy: Я процитировал текст из книги –

+0

«Что вы прочитали» – jahroy

ответ

2

Он похож на FileInputStream. Да, у FileInputStream есть финализатор, который автоматически закрывает его, если вы этого не сделаете, но ожидаемая модель программирования заключается в том, что вы явно закрываете ее, когда вы закончите, чтобы вы не просачивали файловые дескрипторы.

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

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