Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как написать аннотацию EJB 3.1, аннотация для Stateful бина 
:(
    Опции темы
Atum
Дата 18.2.2013, 11:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 265
Регистрация: 3.10.2008

Репутация: нет
Всего: нет



Добрый день ! 

Вопрос такой : хочется создать свою аннотацию  для Stateful  Бина - чтобы можно было его инжектировать по средствам ее в Сервлете !

Хочется  написать такую аннотакцию которая бы позволяла добиться такого же эффекта как 
 и для Stateless бинов при их инжектировании в сервлет по средствам @EJB аннотации 

Называется к примеру @EJBStateful

Вопрос : Как еще реализовать?

servlet 3  + Stateful EJB 3.1

что есть :
 
1.Stateful Бин с бизнеес логикой , который хочется привязать к сессии пользователя. 
2.Сервлет в котором этот бин получается из атрибута сессии !
3.ServletContextListener, HttpSessionListener  которые  и добавляют в сессию пользователя  этот бин как атрибут 

сейчас поиск происходит через InitialContext(). 

Хочется реализовать это все так чтобы я просто в сервлете мог написать 

Код

@EJBStateful
private  FacadeStatefulBean  facadeStatefulBean;  


и работать с таким бином по привычной схеме. Возможно ли создать такую аннотацию? 



Реализация того как это работает сейчас : 
Код

@Stateful
@LocalBean 
public class FacadeStatefulBean   {

 private long id;

    public String info() {
        return "FacadeStatefulBean";
    }
    
    @Remove
    public void myRemove() {
        System.out.printf("---------FacadeStatefulBean myRemove id -----------", id);
    }

    @PostConstruct
    public void init() {
        id = System.currentTimeMillis();
        System.out.printf("---------FacadeStatefulBean  id = {%d} -----------", id);

    }

    @PreDestroy
    public void destroy() {
        System.out.printf("--------- FacadeStatefulBean destroy id = {0} -----------", id);
    }

    @PostActivate
    public void activate() {
        System.out.printf("--------- FacadeStatefulBean activate id = {%d} -----------", id);
    }

    @PrePassivate
    public void passivate() {
        System.out.printf("---------FacadeStatefulBean passivate id = {%d} -----------", id);
    }


}



сервлет который обслуживает запросы клиента 

Код

@WebServlet(name = "s1", urlPatterns = {"/s1"})
public class s4 extends HttpServlet {

protected void processRequest(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter out = response.getWriter();
        try {
            HttpSession session = request.getSession(true);
           FacadeStatefulBean   facadeStatefulBean= (FacadeStatefulBean) session.getAttribute("FacadeStatefulBean");
             if(facadeStatefulBean!=null){
                   facadeStatefulBean.info(); 
            }
...

    }

}


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

Код

@WebListener()
public class ServletListener implements ServletContextListener, HttpSessionListener {


    @Override
    public void sessionCreated(HttpSessionEvent se) {
        FacadeStatefulBean   facadeStatefulBean   = null;
        HttpSession session =   se.getSession();
        session.setMaxInactiveInterval(5); // как пример чтобы не создавать ресурсы на долго.
        try {
            Context context = new InitialContext();
             Object  o =   context.lookup("java:global/EAR/EJBModule/FacadeStatefulBeanl!ru.model.FacadeStatefulBean");
            FacadeStatefulBean= (FacadeStatefulBean) o; 
             
        } catch (NamingException ex) {
            Logger.getLogger(ServletListener.class.getName()).log(Level.SEVERE, null, ex);
        }
         
         
         
        
        session.setAttribute(FacadeStatefulBean", facadeStatefulBean);
        System.out.println("----ServletListener sessionCreated---  " );

    }

    @Override
    public void sessionDestroyed(HttpSessionEvent se) {
       HttpSession session =  se.getSession();
       FacadeStatefulBean ful = (FacadeStatefulBean) session.getAttribute("FacadeStatefulBean");
       ful.myRemove();
        System.out.println("----ServletListener sessionDestroyed---  " );

    }


PM MAIL   Вверх
korian
Дата 18.2.2013, 19:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 651
Регистрация: 8.3.2008
Где: Украина, Харьков

Репутация: 1
Всего: 17



Цитата(Atum @  18.2.2013,  10:28 Найти цитируемый пост)
Хочется  написать такую аннотакцию которая бы позволяла добиться такого же эффекта как 
 и для Stateless бинов при их инжектировании в сервлет по средствам @EJB аннотации 

Я возможно чего-то не понимаю, но Stateless от Stateful ничем не отличается в данном случае. Т.е. если у вас работает инъекты со Stateless, то должны работать и со Stateful.
PM   Вверх
Atum
Дата 19.2.2013, 08:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 265
Регистрация: 3.10.2008

Репутация: нет
Всего: нет



Хм, т.е. вы предлагаете в servlete  просто написать 

@EJB 
private  FacadeStatefulBean  facadeStatefulBean;
  

для Stateful  бина? 

сомневаюсь что это пройдет .
PM MAIL   Вверх
korian
Дата 19.2.2013, 17:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 651
Регистрация: 8.3.2008
Где: Украина, Харьков

Репутация: 1
Всего: 17



Цитата(Atum @  19.2.2013,  07:34 Найти цитируемый пост)
Хм, т.е. вы предлагаете в servlete  просто написать 

Вы так спрашиваете, что я аж сомневаться начал...
Верю, что да. Можете проверить?

PM   Вверх
Atum
Дата 20.2.2013, 10:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 265
Регистрация: 3.10.2008

Репутация: нет
Всего: нет



Цитата(korian @ 19.2.2013,  17:24)
Цитата(Atum @  19.2.2013,  07:34 Найти цитируемый пост)
Хм, т.е. вы предлагаете в servlete  просто написать 

Вы так спрашиваете, что я аж сомневаться начал...
Верю, что да. Можете проверить?

Насколько я понимаю текущую схему работы Сервлета и EJB.

экземпляр сервлета всегда один но сервлет многопоточный - и когда мы в нем инжектируем Stateless  бин  - мы фактически создаем ссылку на EJB-контейнер который нам выдает экземпляры Stateless бинов .
Для каждого пользователя -потока  будет создаваться свой бин или браться из Пула EJB контейнера.

Для Stateful  такая схема не подходит - потому что Stateful бин хранит состояние .  
Простой пример - два одновременных запроса от двух пользователей оба хотят поменять значение переменной в Stateful  бине - дергают  функцию setName(name);

какой будет результат и механизм вызова Stateful бина в Сервлете ?
PM MAIL   Вверх
korian
Дата 20.2.2013, 14:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 651
Регистрация: 8.3.2008
Где: Украина, Харьков

Репутация: 1
Всего: 17



В месте инъекции хранится не сам объект, а прокси-объект. Он то и разгуливает, для какого объекта вызвать setName.

PM   Вверх
Atum
Дата 21.2.2013, 10:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 265
Регистрация: 3.10.2008

Репутация: нет
Всего: нет



Цитата(korian @ 20.2.2013,  14:31)
В месте инъекции хранится не сам объект, а прокси-объект. Он то и разгуливает, для какого объекта вызвать setName.

Пример! 

создайте два бина Stateless  и Stateful  .
Поставьте в них счетчик int count =0;
и увеличивайте его при вызове функции info() 

public int info(){
return ++count;
}

два сервлета s1Stateless  и s1Stateful    с @EJB этих бинов. 

для Stateless  - должен быть уникальный счетчик для каждого пользователя на его сессию.

для s1Stateful    - будет каша в выводе -  если будет несколько клиентов и несколько браузеров.


Если просто добавить Stateful - как вы описали - то будет такая же каша  как и со Stateless  бином.



PM MAIL   Вверх
korian
Дата 21.2.2013, 19:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 651
Регистрация: 8.3.2008
Где: Украина, Харьков

Репутация: 1
Всего: 17



Цитата(Atum @  21.2.2013,  09:41 Найти цитируемый пост)
для Stateless  - должен быть уникальный счетчик для каждого пользователя на его сессию.

для s1Stateful    - будет каша в выводе -  если будет несколько клиентов и несколько браузеров.

Если это то, как должно быть - то вы перепутали их местами.

Цитата(Atum @  21.2.2013,  09:41 Найти цитируемый пост)
Если просто добавить Stateful - как вы описали - то будет такая же каша  как и со Stateless  бином.

Сессия создается? Если сессия не создается, то Stateful может работать как Stateless, потому как будет создаваться каждый раз.

Ну и вообще, какой контейнер и окружение используется?
PM   Вверх
Atum
Дата 21.2.2013, 20:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 265
Регистрация: 3.10.2008

Репутация: нет
Всего: нет



Цитата(korian @ 21.2.2013,  19:00)
Сессия создается? Если сессия не создается, то Stateful может работать как Stateless, потому как будет создаваться каждый раз.


glassfish 3 

jboss 7

 что то вы лукавите по поводу Stateful  как Stateless.
PM MAIL   Вверх
korian
Дата 23.2.2013, 21:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 651
Регистрация: 8.3.2008
Где: Украина, Харьков

Репутация: 1
Всего: 17



Короче я частично перепутал то, как оно работает с CDI.
В принципе, можно его и использовать:
https://vaadin.com/wiki/-/wiki/Main/Creatin...%20Applications
PM   Вверх
Atum
Дата 28.2.2013, 16:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 265
Регистрация: 3.10.2008

Репутация: нет
Всего: нет



Есть такой вопрос ,а если использовать аннотации из Context & Dependency Injection


@Named
@SessionScoped

 такой бин будет равняться 


Stateful  бину ?

или я путаю контексты 



EJB -servlet 

Context & Dependency Injection - SessionScoped - в JSF ?!


Это сообщение отредактировал(а) Atum - 28.2.2013, 16:27
PM MAIL   Вверх
korian
Дата 1.3.2013, 03:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 651
Регистрация: 8.3.2008
Где: Украина, Харьков

Репутация: 1
Всего: 17



Цитата(Atum @  28.2.2013,  15:00 Найти цитируемый пост)
 такой бин будет равняться 


Stateful  бину ?

С точки зрения времени жизни - да.
@SessionScoped - есть также в JSF, там можно перепутать импорт.

Для CDI - [@Named] @SessionScoped
Для JSF - @ManagedBean @SessionScoped

PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java EE (J2EE) и Spring | Следующая тема »


 




[ Время генерации скрипта: 0.0754 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.