在无状态会话Bean中拥有全局变量有什么意义?

siv*_*636 7 ejb stateless-session-bean

我们知道无状态会话豆不以任何方式持有国家.那么在无状态会话Bean中拥有全局变量有什么意义呢?为什么它没有在规范中被阻止(以避免不必要的混淆)?

如果有全局变量有任何实际好处,请用一段代码片段解释.

Ber*_*ium 8

来自EJB 3.1规范的引用

4.7无状态会话Bean

无状态会话bean是会话bean,其实例没有会话状态.这意味着当所有bean实例不参与为客户端调用的方法提供服务时,它们是等效的.

术语"无状态"表示实例没有特定客户端的状态.但是,实例的实例变量可以包含跨客户端调用的方法调用的状态.

此类状态的示例包括开放数据库连接和对企业bean对象的对象引用.

重点是没有会话状态.他们可以有"其他"状态.


例如,我用它来检查负载是否在集群节点中的所有实例上均匀分布:

@Stateless(name = "DemoPingSb")
@Remote(DemoPingSbIfc.class)
public class DemoPingSb implements Serializable, DemoPingSbIfc {
    private final AtomicInteger instancePingCount = new AtomicInteger(0);
    private final static AtomicInteger classPingCount = new AtomicInteger(0);

    public DemoPingSb() {
        super();
    }

    public String ping(final String s) {
        final int local = this.instancePingCount.incrementAndGet();
        final int global = classPingCount.incrementAndGet();

        System.out.println("INFO: local " + local + ", global " + global
                + ", s " + s);

        return s.toUpperCase();
    }
}
Run Code Online (Sandbox Code Playgroud)

如果有足够的负载:

13:13:21,769 INFO [stdout](http-localhost-127.0.0.1-8080-1)INFO:local 22,global 22,s hello
13:13:21,936 INFO [stdout](http-localhost-127.0.0.1- 8080-1)INFO:本地1,全球23,你好

因此,在某些特殊情况下,此功能可能很有用.

备注

  • 该规范讨论了实例变量 ; 那里没有涉及静态变量的用法.所以代码可能不正确classPingCount
  • AtomicIntegerfor 的用法instancePingCount可以替换为volatile int,因为(4.10.13)

容器必须确保任何时候只有一个线程可以执行无状态或有状态会话Bean实例.

  • 无状态会话bean永远不会被钝化(4.2)


Ric*_*tze 0

显然,任何答案都必须声明无状态会话 EJB 不得在 EJB 上的方法调用之间保留状态。

EJB 开发人员可以为中间存储定义实例变量,而不是采取强硬方法禁止 EJB 中的实例变量。也许有中间值,并且正在调用内部私有方法;开发人员(可以说是懒惰的)可能只使用实例变量,而不是传递参数和/或创建要在短期内传递的“立即状态对象”。

这里的关键(由规范解决)是,在任何情况下,EJB 开发人员都不应假设任何此类字段将在 EJB 调用之间维护有意义的信息