当前位置: 首页 > 知识库问答 >
问题:

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

邵宏达
2023-03-14

我已经使用java RMI有一段时间了,但我不知道RMI远程存根(在服务器端)是否是单例的?我问的原因是:

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

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

任何和所有的帮助是赞赏!

编辑根据一些问题和评论,我正在改进这个问题:我真正的问题是,服务器端的RMI是否碰巧根据您导出和注册的对象保留了某种对象池?您可以绑定多个具有相同名称的相同类型的对象(有点模拟对象池,RMI可以给我注册的任何对象)或者为了拥有同一对象的多个实例,我必须使用不同的名称注册它们

共有3个答案

楮杰
2023-03-14

RMI its基于代理设计模式。

看看这里怎么说

RMI服务器是一个创建多个远程对象的应用程序。RMI服务器负责:

  1. 创建远程对象的实例(例如,CarImpl instance=new CarImpl())
尉迟轶
2023-03-14

存根不是单例,但您的问题实际上是关于服务器端对象的。它们也不是单例,除非您自己以这种方式实现它们。RMI对此什么都不做。

编辑基于一些问题和评论,我正在完善这个问题:我真正的问题是,服务器端的RMI是否碰巧根据您导出和注册的对象保留了某种对象池?

可以用相同的名称绑定多个相同类型的对象吗

我必须用不同的名字注册他们

你根本不需要注册它们。您需要将一个单例远程对象绑定到注册表中:将其视为其他远程对象的工厂方法,这些远程对象将作为其远程方法的结果返回。例如,一个远程登录对象绑定在注册表中,并且有一个单独的方法,该方法返回一个远程会话对象,每个登录都有一个新的对象,并有自己的API。

梅庆
2023-03-14

首先,“存根”是一个客户端概念,服务器上没有存根。

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

您能用相同的名称绑定多个相同类型的对象吗(在某种程度上模拟对象池,RMI可以给我注册的任何对象)

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

 类似资料:
  • 问题是使用RMI的客户机-服务器通信-我不知道如何返回在服务器空间上运行的对象(或对对象的引用)之类的东西,返回给客户机,然后我可以从该客户机调用该客户机的方法。我需要这个,因为基本的RMI示例仅仅是将字符串或int等数据从服务器传递到客户端,而不是在服务器上运行的完全序列化的对象。 我发现的唯一类似问题是,在RMI中是否可以通过引用传递? 我想做的是: 服务器:创建并导出远程对象(实现远程接口)

  • Navicat 提供强大的工具来管理服务器对象,例如数据库、表、视图、函数等。注意:在 Navicat 中开始使用服务器对象前,你要首先创建连接。

  • 问题内容: 在参考资料中,我读到: 最后,重要的是要意识到所有Angular服务都是应用程序单例。这意味着每个喷油器只有一种给定服务的实例。 但是用这个简单的代码似乎不是一个单例 我有点困惑,你能解释一下我怎么了吗? 更新1 可能不是我不是棚里最犀利的工具,但是在@Khanh TO答复之后,这在参考文献中会是一个更好的解释,尚不十分清楚。 更新2 BOOM,这是一个单身人士! 更新3 但是如果你喜

  • 我们最近将一些数据移植到MongoDB,现在正在考虑运行日常备份,最好是从cron作业,并将其中一个备份恢复到辅助mongo数据库。 我们的系统设置如下: 服务器1:开发mongo数据库 服务器2:两个mongo数据库,一个用于暂存数据,一个用于生产 服务器3:是我们运行所有cron作业/批处理脚本的地方 (我尝试了将用户名和密码连接到主机,但没有将用户名和密码连接到主机) 我收到以下信息: Mo

  • 问题内容: 如果我们拥有and ,是否必然暗示这一点? 这是一个反例,但这是一个作弊: 而且我无法创建这样的反例: 为了澄清我的问题-在 不让相等 运算符做某些疯狂的事情的情况下,一个类是否有可能存在于两个不同的内存位置,或者导入系统会以某种方式防止这种情况发生? 如果是这样,我们如何证明这种行为- 例如,使用reload或做奇怪的事情? 如果不是,是否由语言保证或在任何地方进行了记录? 结语 :

  • 尝试远程启动服务时遇到奇怪的行为。 编辑:我进一步研究了这个问题,发现只有在尝试运行我的特定服务时才会出现这种情况。这意味着我的服务必须从已经登录的用户的会话中运行(这就是为什么如果我之前使用mstsc访问服务器,它仍然可以工作)。所以我想我的新问题是--有没有一种方法可以让我从PowerShell登录到远程机器? 多谢了。