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

时间:2013-04-10 13:31:23

标签: ejb stateless-session-bean

我们知道无状态会话Bean无论如何都不能保持状态。那么在无状态会话Bean中拥有全局变量有什么意义呢?为什么它没有在规范中被阻止(以避免不必要的混淆)?

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

2 个答案:

答案 0 :(得分:8)

来自EJB 3.1 spec

的引用
  

4.7无状态会话豆

     

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

     

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

     

这样的例子       state包括一个开放的数据库连接和一个对企业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();
    }
}

并且如果有足够的负载:

  

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:local 1,global 23,s hello

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

说明

  • 规范谈到实例变量;那里没有使用静态变量。因此,classPingCount
  • 的代码可能不正确
  • AtomicInteger instancePingCount的使用情况可以替换为volatile int,因为(4.10.13)
  

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

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

答案 1 :(得分:0)

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

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

规范解决的关键是在任何情况下,EJB开发人员都不应该假设任何此类字段都能保留有意义的信息 跨EJB的调用