我想确认一下RMI理论。
让我们假设客户端A请求将对象O远程引用到服务器B.
好吧,现在如果In O接口(Interf)有一个像这样的方法: void foo(Interf obj);
当客户端A调用O.foo(O)时,它传递存根引用(在收到之前),然后服务器不使用其本地引用,而是使用Stub对象(由客户端接收),因此每次对O方法的调用都将由Server进行利用其TCP / IP服务。
可以吗?
如果您认为这些可以提高我对RMI的理解,您可以随意添加一些细节。
此致
答案 0 :(得分:2)
CORBA服务器(用于实现RMI / IIOP,而不是RMI / JRMP)通常实现“共置存根”优化。也就是说,如果服务器在存根上为驻留在同一进程中的对象调用方法,则CORBA服务器通常会避免TCP / IP和线程池调度开销。而是复制参数,将在目标对象上调用该方法,并复制并返回结果对象。
作为参考,Java服务器通常实现此优化。生成的存根类使用Util.isLocal方法来确定存根目标是否是本地的。接下来,调用Stub。_servant_preinvoke以获取本地服务方的引用/代理,Util.copyObjects(或Util.copyObject)用于复制参数和返回对象。 (异常处理,RemarshalException等还有其他复杂性,但我已经概述了基本流程。)