【问题标题】:Passing remote parameters in RMI在 RMI 中传递远程参数
【发布时间】:2013-07-06 01:49:29
【问题描述】:

我想确认一下 RMI 理论。

假设客户端 A 向服务器 B 请求对象 O 的远程引用。

好吧,现在如果在 O 接口 (Interf) 中有一个类似的方法: void foo(Interf obj);

当客户端 A 调用 O.foo(O) 时,它会传递存根引用(在收到之前),然后服务器不使用其本地引用而是使用存根对象(由客户端接收),因此服务器对 O 方法的每次调用都会使用它的 TCP/IP 服务。

还好吗?

如果您认为可以提高我对 RMI 的理解,您可以随意添加一些细节。

问候

【问题讨论】:

  • 您需要添加详细信息。 (1)“请求远程参考”是什么意思? (2)“不使用其本地引用而是使用 Stub 对象”是什么意思? (3) “利用其 TCP/IP 服务”是什么意思。 (4) 谁的“TCP/IP 服务”?换句话说,这个问题究竟是关于什么的?
  • 请求远程引用的意思是:Interf O = (Interf) Lookup(...);我的问题是关于服务器接收自己创建的远程引用作为远程方法的参数的情况,以及使用此远程引用的服务器不使用本地引用但刚刚收到的存根这一事实。我想确认一下
  • 导出的远程对象作为远程存根发送,但不会发生相反的情况。为什么您的客户端要向服务器发送它已经拥有的东西?
  • 这只是一个了解背后行为的例子,但是你没有回答我的问题!
  • 事实上,我已经回答了你的问题:'相反的情况不会发生',但你应该注意,这些是 cmets,而不是答案,我主要在哪里试图吸引您了解您的问题实际上是什么,以便可以回答。对 cme​​ts 应该包含答案的任何期望都是错误的。

标签: parameter-passing rmi distributed-computing stub


【解决方案1】:

CORBA 服务器(用于实现 RMI/IIOP,而不是 RMI/JRMP)通常实现“托管存根”优化。也就是说,如果服务器为驻留在同一进程中的对象调用存根上的方法,则 CORBA 服务器通常会避免 TCP/IP 和线程池调度开销。相反,参数被复制,方法将在目标对象上被调用,结果对象被复制并返回。

作为参考,Java 服务器通常会实现此优化。生成的存根类使用Util.isLocal 方法来确定存根目标是否是本地的。接下来,调用 Stub._servant_preinvoke 获取本地服务端的引用/代理,并使用Util.copyObjects(或 Util.copyObject)复制参数并返回对象。 (异常处理、RemarshalException 等还有其他复杂性,但我已经概述了基本流程。)

【讨论】:

  • RMI/IIOP 也是如此。 RMI/JRMP 绝对不是正确的。进行优化会违反 RMI/JRMP 的指定语义。
  • 对不起,我应该更明确地说我的答案只是 RMI/IIOP。我对 RMI/JRMP 没有太多经验。据我所知,您能否给出违反哪些语义的指针(或更长的解释)?谢谢!
  • Remote Method Invocation Specification #2.6 规定所有参数和返回值都通过序列化传递,即通过值副本传递,除非它们是导出的远程对象,当传递存根时。将 RMI 转换为本地方法调用会违反这一点,因为本地方法参数和结果是通过引用传递的。
  • 这正是 Util.copyObject 所做的:它执行参数和返回值的内存序列化/反序列化。为什么 RMI/JRMP 不能实现同样的优化?
  • 我猜可以,但事实并非如此。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多