Stateless和Stateful会话bean之间的区别

ASC*_*kal 6 ejb-3.0

我知道有状态bean在不同的实例方法调用之间保持对话会话,但是无状态不会.我的问题,假设我有一个无状态bean实现,如下所示

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

我有我的bean客户端(一个servlet),它启动bean调用,如下所示

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

....

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

....
Run Code Online (Sandbox Code Playgroud)

根据我的理解,因为我的bean是无状态bean,它不应该以250的值显示.

私有int值; 是一个即时变量,如果一个无状态方法设置其值,则该值将在方法exit上过期.但是在这里,即使通过我的第二个方法调用,我也能得到值'250'.这是违反无国籍概念的吗?我缺少什么吗?

小智 5

调用不同方法时Stateful v Stateless bean行为之间的区别.


STATEFUL:在有状态Bean上调用不同的方法时,会创建不同的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**
Run Code Online (Sandbox Code Playgroud)

STATELESS:在无状态Bean上调用不同的方法时,会合并bean,因此不会创建bean的新实例.

((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**
Run Code Online (Sandbox Code Playgroud)


Rol*_*ner 2

有趣的问题,基本上你是完全正确的。我做了一些研究,一般建议是:“期望你的 Bean 在每次方法调用后忘记所有内容......”(第 81 页)。此外,根据该资源,负责维护无状态会话 Bean 状态的算法是特定于容器/供应商的。因此容器可以在方法执行后选择销毁、重新创建或清除实例。

您可以创建一个多线程测试并查看它在多客户端上的行为方式。