Java RMI - 了解Oracle教程

时间:2014-10-02 20:27:01

标签: java rmi

我正在尝试理解Oracle的Java RMI教程,我有一些问题。作为参考,教程链接在这里:

1)在服务器示例中,main函数的最后一行是:System.out.println("ComputeEngine bound");。正常执行会说,此时主函数退出并且程序终止。但是,有些东西导致程序阻塞。有没有人知道为什么程序会在运行服务器时阻塞(而不是在打印计算引擎后退出)?

2)关于上一个问题,似乎服务器阻塞并侦听端口。它在听什么端口? RMIRegistry如何知道服务器正在侦听哪个端口?

3)我的另一个问题是当客户端从RMIRegistry获取存根(使用registry.lookup)然后在此存根上调用executeTask时,计算是否在运行RMIRegistry的机器上进行,或者机器运行服务器代码?即存根是否告诉RMIRegistry在注册表中或服务器executeTask函数内的computeEngine实例上运行main

2 个答案:

答案 0 :(得分:2)

RMI创建后台侦听线程。在这些线程死亡之前,程序不会终止。

它指定0作为端口,这意味着它使用OS定义范围的随机端口。

存根封装TCP / IP调用以通知服务器调用该方法。因此,实际的实现在托管代码的服务器上运行。如果在服务器代码上放置println,则会在调用该函数时看到它打印出来。

答案 1 :(得分:0)

  1. RMI为其正在侦听的每个端口创建一个接受线程。这些线程仅在相应端口上导出的所有远程对象未明确或通过DGC导出时退出。
  2. 它正在侦听在构造或导出远程对象时指定的任何端口,或者如果未指定一个或指定的零,则侦听系统分配的端口。注册表不知道是什么端口,但存根确实。
  3. 计算发生在远程对象导出的主机上,但通常与注册表的主机相同,因为很难(但不是不可能)将远程对象绑定到不同主机中的注册表。