是否将RMI上的并发远程调用公开的jBoss EJB序列化?

时间:2010-11-05 09:22:45

标签: java concurrency jboss ejb rmi

这是昨天提到的同一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上被阻止。

2 个答案:

答案 0 :(得分:1)

呼叫将至少被服务器端的容器阻止。但请注意,几乎所有应用服务器都有线程池来限制请求数量,因此无状态bean池大小为1000且服务器线程池大小为100对您没什么好处 - 您的无状态bean池永远不会超过100。

所以要检查的事情是:

  1. 是否有客户端连接池及其大小?
  2. 是否有服务器端线程池及其大小是多少?
  3. 如果没有客户端连接池并且所有线程共享相同的连接,那么除非在客户端/服务器之间使用NIO,否则你的数量非常有限。

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

答案 1 :(得分:0)

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