Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > Java EE (J2EE) и Spring > Как написать аннотацию EJB 3.1 |
Автор: Atum 18.2.2013, 11:28 | ||||||||
Добрый день ! Вопрос такой : хочется создать свою аннотацию для Stateful Бина - чтобы можно было его инжектировать по средствам ее в Сервлете ! Хочется написать такую аннотакцию которая бы позволяла добиться такого же эффекта как и для Stateless бинов при их инжектировании в сервлет по средствам @EJB аннотации Называется к примеру @EJBStateful Вопрос : Как еще реализовать? servlet 3 + Stateful EJB 3.1 что есть : 1.Stateful Бин с бизнеес логикой , который хочется привязать к сессии пользователя. 2.Сервлет в котором этот бин получается из атрибута сессии ! 3.ServletContextListener, HttpSessionListener которые и добавляют в сессию пользователя этот бин как атрибут сейчас поиск происходит через InitialContext(). Хочется реализовать это все так чтобы я просто в сервлете мог написать
и работать с таким бином по привычной схеме. Возможно ли создать такую аннотацию? Реализация того как это работает сейчас :
сервлет который обслуживает запросы клиента
создание новой сессии кладем ссылку на этот бин в сессию пользователя , при уничтожении ... удаляем , высвобождая ресурсы.
|
Автор: Atum 19.2.2013, 08:34 |
Хм, т.е. вы предлагаете в servlete просто написать @EJB private FacadeStatefulBean facadeStatefulBean; для Stateful бина? сомневаюсь что это пройдет . |
Автор: korian 19.2.2013, 17:24 |
Вы так спрашиваете, что я аж сомневаться начал... Верю, что да. Можете проверить? |
Автор: Atum 20.2.2013, 10:03 | ||
Насколько я понимаю текущую схему работы Сервлета и EJB. экземпляр сервлета всегда один но сервлет многопоточный - и когда мы в нем инжектируем Stateless бин - мы фактически создаем ссылку на EJB-контейнер который нам выдает экземпляры Stateless бинов . Для каждого пользователя -потока будет создаваться свой бин или браться из Пула EJB контейнера. Для Stateful такая схема не подходит - потому что Stateful бин хранит состояние . Простой пример - два одновременных запроса от двух пользователей оба хотят поменять значение переменной в Stateful бине - дергают функцию setName(name); какой будет результат и механизм вызова Stateful бина в Сервлете ? |
Автор: korian 20.2.2013, 14:31 |
В месте инъекции хранится не сам объект, а прокси-объект. Он то и разгуливает, для какого объекта вызвать setName. |
Автор: Atum 21.2.2013, 10:41 | ||
Пример! создайте два бина Stateless и Stateful . Поставьте в них счетчик int count =0; и увеличивайте его при вызове функции info() public int info(){ return ++count; } два сервлета s1Stateless и s1Stateful с @EJB этих бинов. для Stateless - должен быть уникальный счетчик для каждого пользователя на его сессию. для s1Stateful - будет каша в выводе - если будет несколько клиентов и несколько браузеров. Если просто добавить Stateful - как вы описали - то будет такая же каша как и со Stateless бином. |
Автор: korian 21.2.2013, 19:00 | ||||
Если это то, как должно быть - то вы перепутали их местами.
Сессия создается? Если сессия не создается, то Stateful может работать как Stateless, потому как будет создаваться каждый раз. Ну и вообще, какой контейнер и окружение используется? |
Автор: Atum 21.2.2013, 20:40 | ||
glassfish 3 jboss 7 что то вы лукавите по поводу Stateful как Stateless. |
Автор: korian 23.2.2013, 21:06 |
Короче я частично перепутал то, как оно работает с CDI. В принципе, можно его и использовать: https://vaadin.com/wiki/-/wiki/Main/Creating%20JEE6%20Vaadin%20Applications |
Автор: Atum 28.2.2013, 16:00 |
Есть такой вопрос ,а если использовать аннотации из Context & Dependency Injection @Named @SessionScoped такой бин будет равняться Stateful бину ? или я путаю контексты EJB -servlet Context & Dependency Injection - SessionScoped - в JSF ?! |
Автор: korian 1.3.2013, 03:57 |
С точки зрения времени жизни - да. @SessionScoped - есть также в JSF, там можно перепутать импорт. Для CDI - [@Named] @SessionScoped Для JSF - @ManagedBean @SessionScoped |