java - java RMI 远程对象(服务器)是单例吗?

标签 java spring rmi remoteobject

我已经使用 java RMI 一段时间了,但我无法弄清楚 RMI 远程 stub (在服务器端)是否是单例的?我问的原因是:

让我们假设调用链中较低的 RMI 实现方法之一有一个同步方法。如果出于某种原因同步方法中的逻辑被搞乱(或挂起), future 的 RMI 调用(来自客户端)在尝试访问该同步方法时也会挂起。仅当 RMI stub 将成为单例时,这才成立。如果在客户端每次远程调用时在服务器端创建一个新对象,这将不是问题,因为方法是从不同的对象调用的,同步方法将不再是问题。

长话短说。我试图了解 JVM 如何在服务器端内部维护 rmi 远程对象,以及它们是否是单例的。我尝试了许多不同的 javadoc,但他们没有在任何地方明确提及这一点。

感谢任何帮助!

编辑 基于一些问题和评论,我正在提炼问题:我真正的问题是,服务器端的 RMI 是否恰好根据您导出和注册的对象保留某种对象池?您能否绑定(bind)多个具有相同名称的相同类型的对象(有点模拟对象池,RMI 可以在其中为我提供我注册的任何对象)或者为了拥有同一对象的多个实例,我将不得不用不同的名字注册它们

最佳答案

首先,“ stub ”是客户端的概念,服务器端没有 stub 。

至于远程对象本身,RMI 系统不会为您实例化对象,由您创建实例并导出它们。您创建该对象的一个​​实例,导出该对象,并以特定名称将其绑定(bind)到注册表中。从注册表中的相同名称获取的对客户端 stub 的所有调用最终将在服务器上的相同对象处结束。

Can you bind more than one object of the same type with the same name (somewhat simulating an object pool where RMI can give me any of the objects that I registered)

不可以,您只能在给定名称下绑定(bind)注册表中的一个对象。但是您绑定(bind)的对象本身可以是您自己的对象池的代理,例如使用 Spring AOP CommonsPoolTargetSource机制。

关于java - java RMI 远程对象(服务器)是单例吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25814513/

相关文章:

java - 如何使用java RMI转发消息?

java - CXF - 如何使用 CXF 3.2.6 正确配置 Spnego

c# - 子类型和协变返回类型

java - 如何在 Spring 应用程序上下文中将 Class<?> 设置为属性值?

java - 无法在Java RMI中连接两个远程主机

c# - RMI,现代 Java 相当于 .NET WCF(Windows 通信基础)吗?

java - Clojure 最初的目标是服务器?

java - 数组中两个不同元素之间的最大距离

java - org.json.JSONException) org.json.JSONException : JSONObject ["routes"] not found

java - 创建我的第一个 spring mvc 项目时出错