【问题标题】:Are concurrent remote invocations on an RMI exposed jBoss EJB serialized?RMI 暴露的 jBoss EJB 上的并发远程调用是否序列化?
【发布时间】:2010-11-05 09:22:44
【问题描述】:

这是昨天问的question 的更详细版本。

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

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 上被阻塞。

【问题讨论】:

  • 听起来像是您可以测试的场景:-)。启动 JMeter(或编写一个小型客户端应用程序)看看会发生什么!

标签: java concurrency jboss ejb rmi


【解决方案1】:

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

所以要检查的事情是:

  1. 是否有客户端连接池及其大小?
  2. 是否有服务器端线程池,它的大小是多少?

如果没有客户端连接池并且所有线程共享相同的连接,那么除非在客户端/服务器之间使用 NIO,否则您将受到很大限制。

如果目标只是并行执行,我会使用支持@Remote 调用的EJB 3.1 @Asynchronous 方法支持。这将为您提供最便携的并发性,而不必担心限制您自己的使用。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2016-12-14
      • 2015-03-18
      • 1970-01-01
      • 2011-10-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-07
      • 2021-12-27
      相关资源
      最近更新 更多