在我的基于EJB3.0和JBoss5的应用程序中,我使用来自JBoss AsyncUtils的异步代理。 有状态bean ComputerBean 将工作分配给无状态池 ProcessorBean (s)。我在CounterBeans中构建了一个计数器来打印出当前实例化了多少个。这是代码:
@Stateful
public class ComputerBean implements ComputerRemote {
@EJB
private ProcessorLocal processor;
public void startComputations() {
Random r = new Random();
while(true) {
AsyncUtils.mixinAsync(processor).compute(r.nextInt());
}
}
}
@Stateless
public class ProcessorBean implements ProcessorLocal {
private static int COUNTER = 0;
@PostConstruct
public void init() {
System.out.println("constructing");
COUNTER++;
}
@PreDestroy
public void destroy() {
System.out.println("destroying");
COUNTER--;
}
public void compute(int i) {
System.out.println("----------------> " + COUNTER);
// some dummy computations - it's here only in order to take some time
double d = 0.3;
for (int j=0; j<100; j++) {
d+= 0.2 % 4 + i;
}
}
}
JBoss运行的跟踪控制台我注意到SLSBeans的数量增加(由于负载较高),但它永远不会下降,即使我停止计算20分钟,然后重新启动。
这是一个虚拟的例子,但我想在一个更复杂的系统中使用这个机制,所以我必须确定我确切知道它是如何工作的。我做错什么了吗?为什么SLSBeans计数器永远不会下降?
提前致谢, 彼得
答案 0 :(得分:0)
您最有可能遇到无状态会话bean被池化的事实。您应该看到将创建的最大Bean数,因为默认情况下池具有固定大小。
显然,这个特定的池实现在给定的时间后不会降低池的性能。您可以通过JBoss特定的注释来调整池的一些行为。见:
http://docs.jboss.org/ejb3/docs/reference/build/reference/en/html/session-bean-config.html
如果你真的想要,你也可以替换默认池,并在一段时间后删除实例。