我们知道无状态会话Bean无论如何都不能保持状态。那么在无状态会话Bean中拥有全局变量有什么意义呢?为什么它没有在规范中被阻止(以避免不必要的混淆)?
如果有全局变量有任何实际好处,请用一段代码片段解释。
答案 0 :(得分:8)
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 实例在任何时候。
答案 1 :(得分:0)
显然,任何答案都必须声明无状态会话EJB在对EJB上的方法的调用之间不能保持状态。
不是通过在EJB中禁止实例变量来采取强硬方法, 允许EJB开发人员为中间存储定义它们。 也许有中间价值, 正在调用内部私有方法; 而不是传递参数 和/或创建一个短期通过的“直接状态对象”, 开发人员(可以说是懒惰的)可能只使用实例变量。
规范解决的关键是在任何情况下,EJB开发人员都不应该假设任何此类字段都能保留有意义的信息 跨EJB的调用。