【问题标题】:Where is the code executed when using Java RMI?使用 Java RMI 时代码在哪里执行?
【发布时间】:2013-11-03 12:28:30
【问题描述】:

没有任何Java RMI的经验,我有一个幼稚的问题,但搜索互联网后仍然不确定答案。

问题:

对我来说,有两种情况:

场景一:从本地启动一个Java程序,在执行过程中,它会从存储在远程机器上的类中调用一个方法,然后将该方法的类下载到本地机器,然后继续执行。

场景2:从本地启动一个Java程序,在执行过程中,它调用存储在远程机器上的类中的方法,然后该方法将在远程机器上执行,并且结果将被发送回本地机器。 (这需要类/对象转移吗?

Java RMI 使用哪一个?还是两者都没有?

来自Wikipedia of RPC:“RPC 允许计算机程序使子例程或过程在另一个地址空间(通常在共享网络上的另一台计算机上)执行”,似乎是第二种情况。

但根据这篇论文Reducing Data Transfer during Remote Classloading in Java RMI,似乎是第一种情况。

【问题讨论】:

  • 链接论文的哪一部分让您认为这是场景 #2?
  • @StephenCS 链接的论文让我觉得这是场景 #1,因为它提到了远程类加载(对我来说,将远​​程类加载到本地)。
  • 远程类加载并不意味着。这意味着从远离代码运行位置的位置加载类(代码)。代码移动到 RMI 目标对象......反之亦然。
  • @StephenC 这里的“代码移动到RMI目标对象”,你的意思是在RMI的情况下代码被移动到远程机器吗?

标签: java rmi rpc dynamic-class-loaders


【解决方案1】:

该方法将在远程机器上执行。为此,本地机器下载一个封装本地机器和远程机器之间通信的类。

【讨论】:

  • 这需要动态类加载吗?
  • @JackWM 要么将所有相关的类部署到服务器和客户端。
【解决方案2】:

使用 RMI 时,您基本上拥有一个在客户端和服务器之间共享的接口。服务器必须有一个实现,客户端不应该有这个实现。所以没有类加载或任何类型的客户端到服务器的逻辑传输,客户端完全不知道服务器接口的实现。

RMI序列化并传输方法参数,然后执行服务器逻辑,将结果序列化并传输回客户端。

【讨论】:

  • 谢谢,安德烈。所以它确实传输对象,对吧?全局变量/类成员呢?
  • 远程方法调用的参数必须是Serializablevisible to both server and client
  • 思路很简单,就是“打包我的参数,传输,执行方法,打包结果再传回来”。
  • 如果转移的方法调用其他用户方法会发生什么?
  • 嗯,这几乎是不可能的,因为Serializable 保证了这一点。这意味着可以将对象写入ObjectOutputStreambyte[] 并从ObjectInputStreambyte[] 读取。无论如何,对于远程调用,他们通常使用所谓的“数据传输对象”。通常这些是具有单个默认构造函数、公共字段或属性且没有其他方法的对象。这样做是为了确保您描述的情况永远不会发生。您可能需要查看 Serializable Java Doc 了解更多详情。
猜你喜欢
  • 1970-01-01
  • 2021-06-22
  • 1970-01-01
  • 1970-01-01
  • 2014-03-24
  • 1970-01-01
  • 1970-01-01
  • 2017-09-20
  • 1970-01-01
相关资源
最近更新 更多