有状态与无状态EJB的预期行为

时间:2017-01-03 01:09:08

标签: java-ee ejb ejb-3.0 ejb-3.1

我试图推出一个Stateful vs Stateless EJB的一个非常简单的例子, 我得到了一个非常意外的行为:正如你在下面看到的那样,有状态bean似乎每次都被实例化,而无状态bean似乎通过一个单独的实例被调用。

虽然这是有道理的,但不知何故,这与我正在阅读的EJB书籍所说的完全相反,所以我真的很震惊。

根据我的基本理解,Stateless EJB用于执行简单的无记忆查询(例如计算),而有状态EJB需要在整个客户端请求(例如在线电子商务篮子)中维护“状态”。

让我感到困惑的是instanciation模式,因为不管怎样,“count”整数似乎在无状态bean中被跟踪。这本身不是问题,因为这个bean在理论上不需要在每次调用时重新实现,因为它执行无记忆任务,与有状态bean不同。但是,我正在阅读的这本书(“通过示例进行的EJB 3 Web开发”,由Celinio Fernandes撰写,用于记录)似乎在实现时表现出相反的结果:“一个单独的有状态bean实例是为来自客户端的所有呼叫创建,而为每个客户端呼叫调用不同的无状态实例。“

真的是这样吗?我在这里错过了什么?书中的这个陈述似乎与我的理解不符合下面的代码。

HelloStatelessEJBRemote lbean0 = doLookup1();
HelloStatelessEJBRemote lbean1 = doLookup1();
HelloStatelessEJBRemote lbean2 = doLookup1();

System.out.println(lbean0.sayHello());
System.out.println(lbean1.sayHello());
System.out.println(lbean2.sayHello());

HelloStatefulEJBRemote fbean0 = doLookup2();
HelloStatefulEJBRemote fbean1 = doLookup2();
HelloStatefulEJBRemote fbean2 = doLookup2();

System.out.println(fbean0.sayHello());
System.out.println(fbean1.sayHello());
System.out.println(fbean2.sayHello());

控制台输出:

Hello Stateless World n° 0 !!!
Hello Stateless World n° 1 !!!
Hello Stateless World n° 2 !!!

Hello Stateful World n° 0 !!!
Hello Stateful World n° 0 !!!
Hello Stateful World n° 0 !!!

StatelessEJB代码:

@Stateless
@LocalBean
public class HelloStatelessEJB implements HelloStatelessEJB Remote {

    int count = 0;

    @Override
    public String sayHello() {
        return "Hello Stateless World n° " + count++ + " !!!";
    }
}

StatefulEJB代码:

@Stateful
@LocalBean
public class HelloStatefulEJB implements HelloStatefulEJB Remote {

    int count = 0;

    @Override
    public String sayHello() {
        return "Hello Stateful World n° " + count++ + " !!!";
    }
}

0 个答案:

没有答案