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
上被阻止
# 1 楼答案
我认为如果你想要异步行为,使用MDB/MDP是你想要的方式
# 2 楼答案
这些调用至少会被服务器端的容器阻止。但是要注意,几乎所有的应用服务器都有线程池来限制请求的数量,所以无状态bean池大小为1000,服务器线程池大小为100,这对你没有什么好处——你的无状态bean池永远不会超过100
所以需要检查的是:
如果没有客户端连接池,并且所有线程都共享同一个连接,那么您在这方面就受到了很大的限制,除非在客户端/服务器之间使用NIO
如果目标是并行处理,我会使用EJB3.1@Asynchronous方法支持,它支持@Remote调用。这将为您提供最多的并发性和最可移植性,而无需担心限制自己的使用