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

标签 jakarta-ee concurrency jboss ejb-3.0 stateful

我有一个调用远程有状态 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]

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

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

最佳答案

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

关于jakarta-ee - 来自不同客户端的 EJB3 有状态并发调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7001740/

相关文章:

java - tomcat = apache(或其他网络服务器)+ JavaEE?

java - Maven 原型(prototype)中的公爵年龄在哪里?每第一杯 JEE7

javascript - 我添加自定义过滤器来解决允许跨原点的问题,但仍然拒绝 Angular 仅发送选项方法,并且不发送 get 或 post

java - jBOSS+ ESAPI java.lang.ClassCastException : org. jboss.logmanager.log4j.BridgeLogger 无法转换为 org.owasp.esapi.Logger

spring - 如何解决 Jsf :Property 'not found" on type with root cause?

go - 如何使变量成为线程安全的

Java 并发 : Shared Memory Between Threads

go - 执行 goroutine 时的并发与并行

java - joinTransaction 已在 JBoss 中的资源本地 EntityManager 上调用

java - JBoss AS 在 Mac OS 上无法启动?