我有一个调用远程有状态 ejb 的富客户端 swing 应用程序。我正在使用 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]
我可以注意到有状态的两个不同实例(正如预期的那样,每个客户端一个实例),它们在不同的线程中运行。
当我使用无状态而不是有状态时,它可以工作。但是,在我的应用程序中,我需要保留一些来自客户端的数据,而有状态的似乎更合适。