我一直在使用java RMI一段时间,但我无法弄清楚RMI Remote Stubs(在服务器端)是否是单例?我问的原因是:
假设调用链中较低的RMI实现方法之一具有synchronized方法.如果出于某种原因,同步方法中的逻辑混乱(或挂起),则在尝试访问该同步方法时,未来的RMI调用(来自客户端)也会挂起.只有当RMI存根将成为单例时,这才会成立.如果在客户端的每次远程调用时在服务器端创建一个新对象,这将不会成为问题,因为从另一个对象调用方法并且同步方法将不再是问题.
长话短说.我试图了解JVM如何在服务器端内部维护rmi远程对象以及它们是否是单例.我尝试了许多不同的javadoc,但他们没有在任何地方明确提到它.
任何和所有的帮助表示赞赏!
编辑
基于一些问题和评论,我正在提炼这个问题:我真正的问题是,服务器端的RMI是否碰巧根据您导出和注册的对象保留某种对象池?你能绑定多个具有相同名称的同一类型的对象(有些模拟一个对象池,其中RMI可以给我任何我注册的对象),或者为了拥有同一个对象的多个实例,我将不得不用不同的名字注册它们
解决方法:
首先,“存根”是一个客户端概念,服务器上没有存根.
对于远程对象本身,RMI系统不会为您实例化对象,您可以创建实例并导出它们.您创建对象的一个实例,导出该对象,并在特定名称下将其绑定在注册表中.在注册表中从同一名称获取的客户端存根上的所有调用最终都将终止于服务器上的同一对象.
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)
不,您只能在给定名称下绑定注册表中的一个对象.但是绑定的对象本身可以是您自己的对象池的代理,例如使用Spring AOP CommonsPoolTargetSource机制.