来自不同客户端的EJB3有状态并发调用

时间:2011-08-09 19:23:17

标签: java-ee concurrency jboss ejb-3.0 stateful

我有一个富客户端swing应用程序调用远程有状态ejb。我正在使用JBoss 6.0。

我已经在两台不同的机器中部署了客户端,即不同的IP地址,jvms等。

有状态具有以下代码:

@Stateful
public class MyStateful implements MyStatefulRemote{

public void test(){     
    System.out.println(this);
    System.out.println(Thread.currentThread());
    System.out.println(Thread.currentThread().getThreadGroup());

    // cpu intensive task                
    String value = "";
    for (int j = 0; j < Integer.MAX_VALUE; j++) {
        value = "" + j;
    }
}

客户端具有以下代码:

...
String JNDI_FACADE = "MyStateful/remote";
InitialContext context = new InitialContext();
MyStatefulRemote my = (MyStatefulRemote) context.lookup(JNDI_FACADE);
my.test();

然后,当我运行第一个客户端时,ejb执行println命令并开始执行循环(如预期的那样)。但是,当我在另一台机器上运行第二个客户机时,ejb在第一个方法调用完成之前不会打印任何内容。换句话说,似乎有状态bean无法处理并发调用,即使是来自不同的客户端也是如此。

如果我们查看println命令,我们可以看到:

br.com.alta.MyStateful@61ef35
WorkerThread#6[192.168.7.58:54271]
java.lang.ThreadGroup[name=jboss,maxpri=10]

当服务器完成第一次调用的执行时,第二次调用打印输出:

br.com.alta.MyStateful@17539b3
WorkerThread#1[192.168.7.53:54303]
java.lang.ThreadGroup[name=jboss,maxpri=10]

我可以注意到有两个不同的有状态实例(正如预期的那样,每个客户端有一个实例),它们在不同的线程中运行。

当我使用无状态而不是有状态时,它可以工作。但是,在我的应用程序中,我需要保留一些来自客户端的数据,而有状态似乎更合适。

2 个答案:

答案 0 :(得分:4)

这似乎是影响JBoss AS 6的错误:https://issues.jboss.org/browse/JBAS-9416

答案 1 :(得分:0)

默认情况下,EJB不允许对有状态bean进行并发调用。我知道,在Weblogic服务器上,您可以使用allow-concurrent-calls属性启用此功能。在JBoss上,很可能你必须重新设计你的架构并使用无状态bean。