这是昨天提到的同一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
上被阻止。
答案 0 :(得分:1)
呼叫将至少被服务器端的容器阻止。但请注意,几乎所有应用服务器都有线程池来限制请求数量,因此无状态bean池大小为1000且服务器线程池大小为100对您没什么好处 - 您的无状态bean池永远不会超过100。
所以要检查的事情是:
如果没有客户端连接池并且所有线程共享相同的连接,那么除非在客户端/服务器之间使用NIO,否则你的数量非常有限。
如果目标是并行执行,我将使用支持@Remote调用的EJB 3.1 @Asynchronous方法支持。这将为您提供最便携的并发性,而不必担心限制自己的使用。
答案 1 :(得分:0)
我想如果你想要异步行为,那么使用MDB / MDP就是你想要的方式。