用JBoss破坏SLSB的asnync代理

时间:2011-01-24 21:54:12

标签: asynchronous ejb-3.0 jboss5.x

在我的基于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计数器永远不会下降?

提前致谢, 彼得

1 个答案:

答案 0 :(得分:0)

您最有可能遇到无状态会话bean被池化的事实。您应该看到将创建的最大Bean数,因为默认情况下池具有固定大小。

显然,这个特定的池实现在给定的时间后不会降低池的性能。您可以通过JBoss特定的注释来调整池的一些行为。见:

http://docs.jboss.org/ejb3/docs/reference/build/reference/en/html/session-bean-config.html

如果你真的想要,你也可以替换默认池,并在一段时间后删除实例。