siv*_*636 7 ejb stateless-session-bean
我们知道无状态会话豆不以任何方式持有国家.那么在无状态会话Bean中拥有全局变量有什么意义呢?为什么它没有在规范中被阻止(以避免不必要的混淆)?
如果有全局变量有任何实际好处,请用一段代码片段解释.
来自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,你好
因此,在某些特殊情况下,此功能可能很有用.
备注
classPingCountAtomicIntegerfor 的用法instancePingCount可以替换为volatile int,因为(4.10.13)容器必须确保任何时候只有一个线程可以执行无状态或有状态会话Bean实例.
显然,任何答案都必须声明无状态会话 EJB 不得在 EJB 上的方法调用之间保留状态。
EJB 开发人员可以为中间存储定义实例变量,而不是采取强硬方法禁止 EJB 中的实例变量。也许有中间值,并且正在调用内部私有方法;开发人员(可以说是懒惰的)可能只使用实例变量,而不是传递参数和/或创建要在短期内传递的“立即状态对象”。
这里的关键(由规范解决)是,在任何情况下,EJB 开发人员都不应假设任何此类字段将在 EJB 调用之间维护有意义的信息。
| 归档时间: |
|
| 查看次数: |
1952 次 |
| 最近记录: |