Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/api/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asynchronous JBoss销毁SLSB的asnync代理_Asynchronous_Ejb 3.0_Jboss5.x - Fatal编程技术网

Asynchronous JBoss销毁SLSB的asnync代理

Asynchronous JBoss销毁SLSB的asnync代理,asynchronous,ejb-3.0,jboss5.x,Asynchronous,Ejb 3.0,Jboss5.x,在基于EJB3.0和JBoss5的应用程序中,我使用JBossAsyncUtils中的异步代理。 有状态beanComputerBean将工作分派给无状态池处理器bean。我在ProcessorBeans中构建了计数器,以打印出当前实例化了多少个。代码如下: @Stateful public class ComputerBean implements ComputerRemote { @EJB private ProcessorLocal processor; pub

在基于EJB3.0和JBoss5的应用程序中,我使用JBossAsyncUtils中的异步代理。 有状态beanComputerBean将工作分派给无状态池处理器bean。我在ProcessorBeans中构建了计数器,以打印出当前实例化了多少个。代码如下:

@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());
        }
    }
}

@无状态
公共类ProcessorBean实现ProcessorLocal{
专用静态整数计数器=0;
@施工后
公共void init(){
System.out.println(“构建”);
计数器++;
}
@发情前期
公共空间销毁(){
系统输出打印(“销毁”);
计数器--;
} 
公共空间计算(int i){
System.out.println(“------------------------------>”+计数器);
//一些虚拟计算-它在这里只是为了花一些时间
双d=0.3;

对于(int j=0;j您很可能遇到无状态会话bean被池化的事实。您应该看到将要创建的bean的最大数量,因为池在默认情况下具有固定的大小

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


如果您真的愿意,您还可以替换默认池,并可能在一段时间后删除实例。

谢谢您的回答,我按照您的建议使用了问题中的代码:@Stateless@PoolClass(value=org.jboss.ejb3.StrictMaxPool.class,maxSize=5,timeout=10000)公共类ProcessorBean实现ProcessorLocal{(…)但不幸的是,它并没有解决这个问题——在控制台上,我可以观察到计数器增加到了~27。(考虑到我设置的最大池大小,这非常奇怪……我会说这是不可能的:)我会说。有一件事可能是你的代码不是真正的线程安全的。你正在对一个非同步静态变量执行计数器+。你可能想尝试使用AtomicInteger。将增量的结果存储在bean的一个实例变量中并打印出来。这可能会告诉你更多关于正在发生的事情。这与这个问题稍微相关吗d:还有这个:。如果这个问题仍然不起作用,也要尝试在JBoss论坛上发布。谢谢Arjan,我按照你的建议尝试了AsyncUtils,不幸的是它没有解决问题。我在JBoss论坛上启动了线程:你是对的,但以前使用的注释对JBoss4有效。对于JBoss 5,我应该使用:@Pool(value=PoolDefaults.POOL\u IMPLEMENTATION\u STRICTMAX,maxSize=5,timeout=1000)使用这一个,bean实例的最大数量是5。谢谢!啊,注释的一个缺点是,如果它们过时,它们会“自动失败”。谢谢这里的更新!
@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;
        }
    }
}