Разница между сессионным компонентом без состояния и с состоянием - PullRequest
6 голосов
/ 31 января 2012

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

import javax.ejb.Stateful;
import javax.ejb.Stateless;

import com.tata.ejb3.data.HelloEJBInterface;

@Stateless
public class ValueEJB implements ValueEJBInterface{

    private int value;
    @Override
    public int getValue() {
        return this.value;
    }

    @Override
    public void setValue(int value) {
        this.value = value;
    }
}

У меня есть клиент бина (сервлет) который инициирует вызов бина, как показано ниже

@EJB(mappedName="E/ValueEJB /remote")
ValueEJBInterface value;

....

value.setValue(250);
System.out.println(value.getValue());//This statement prints the value 250

....

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

private int value;является мгновенной переменной, если один метод без сохранения состояния установит свое значение, значение будет истекло при выходе из метода. Но здесь я могу получить значение '250' даже через мой второй вызов метода.Это нарушение концепции лиц без гражданства?Мне чего-то не хватает?

Ответы [ 3 ]

5 голосов
/ 13 сентября 2012

Разница между состоянием Stateful и поведением bean-компонента без сохранения состояния при вызове различных методов.


STATEFUL: При вызове различных методов в Stateful Bean создаются разные экземпляры компонента.

((MyStatefulBeanRemote) ctx.lookup("ejb/MyStatefulBean")).doingStatefulThing();

((MyStatefulBeanRemote) ctx.lookup("ejb/MyStatefulBean")).doingNothingStatefulThing();

***Output: Note the creation of separate objects.***

INFO: Calling doingStatefulThing...com.myeclipseide.ejb3.stateful.**MyStatefulBean@2fe395**

INFO: Calling doingNothingStatefulThing...com.myeclipseide.ejb3.stateful.**MyStatefulBean@81cfcb**

STATELESS: при вызове различных методов для компонента без состояния компоненты объединяются, поэтому новые экземпляры компонента не создаются.

((MyStatelessBeanRemote) ctx.lookup("ejb/MyStatelessBean")).doSomething(); 

((MyStatelessBeanRemote) ctx.lookup("ejb/MyStatelessBean")).doNothing();

***Output: Note the reuse of he bean object.***

INFO: Doing something ...com.myeclipseide.ejb3.stateless.**MyBean@213b61**

INFO: Doing Nothing ...com.myeclipseide.ejb3.stateless.**MyBean@213b61**
2 голосов
/ 31 января 2012

Нет нарушения какой-либо концепции. Это потому, что контейнер из пула выбирает тот же экземпляр bean-компонента для обслуживания другого запроса.

Бины без сохранения состояния объединяются в пул и, следовательно, они имеют преимущество в производительности по сравнению с бобами с сохранением состояния, а также их основное назначение - обработка без удержания состояния.

Чувствительные или специфичные для пользователя данные не должны храниться в переменных экземпляра bean-компонентов без сохранения состояния. Они должны широко использоваться для обработки данных без учета состояния.

Может ссылаться здесь на события жизненного цикла, обрабатываемые контейнером.

2 голосов
/ 31 января 2012

Интересный вопрос и в принципе ты совершенно прав.Я провел некоторое исследование, и общий совет: «Ожидайте, что ваш бин забудет обо всем после каждого вызова метода ...» ( стр. 81 ).Кроме того, согласно этому ресурсу, алгоритм, отвечающий за поддержание состояния Сеансовых компонентов без сохранения состояния, зависит от контейнера / поставщика.Таким образом, контейнер может выбрать уничтожение, воссоздание или очистку экземпляра после выполнения метода.

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

...