有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java在RMI公开的JBossEJB上的并发远程调用是否序列化?

这是昨天所问问题的更详细版本

我有一个客户端应用程序,它通过RMI调用无状态EJB与服务器应用程序通信。正在使用以下配置参数构建初始上下文:

InitialContext ctx = new InitialContext(new Hashtable<String, String>() {
  {
    this.put("java.naming.provider.url", "serverUrl:portNumber");
    this.put("java.naming.factory.initial", "org.jnp.interfaces.NamingContextFactory");
    this.put("java.naming.factory.url", "org.jnp.interfaces.TimedSocketFactory");
  }
});

然后使用以下方法查找代理:

ServerBean bean = (ServerBean) ctx.lookup("ejb/ServerBeanImpl");

然后,客户机生成许多共享ServerBean的同一实例的线程。每个线程时不时地调用共享bean上的远程调用

我的问题是,这些调用是以串行方式还是并行方式执行的?每个远程调用都在服务器上执行。执行一些计算并返回结果。如果所有调用都是序列化的,那么我将不得不限制现有线程的数量,因为它们中的许多线程可以在ServerBean上被阻止


共 (2) 个答案

  1. # 1 楼答案

    我认为如果你想要异步行为,使用MDB/MDP是你想要的方式

  2. # 2 楼答案

    这些调用至少会被服务器端的容器阻止。但是要注意,几乎所有的应用服务器都有线程池来限制请求的数量,所以无状态bean池大小为1000,服务器线程池大小为100,这对你没有什么好处——你的无状态bean池永远不会超过100

    所以需要检查的是:

    1. 是否有客户端连接池及其大小
    2. 是否有服务器端线程池及其大小

    如果没有客户端连接池,并且所有线程都共享同一个连接,那么您在这方面就受到了很大的限制,除非在客户端/服务器之间使用NIO

    如果目标是并行处理,我会使用EJB3.1@Asynchronous方法支持,它支持@Remote调用。这将为您提供最多的并发性和最可移植性,而无需担心限制自己的使用