【问题标题】:Java RMI - Understanding the Oracle TutorialJava RMI - 了解 Oracle 教程
【发布时间】:2014-10-02 20:27:00
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: java rmi


    【解决方案1】:

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

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

    存根封装了一个 TCP/IP 调用以通知服务器调用该方法。这样实际的实现就在托管代码的服务器上运行。如果您在服务器代码上放置一个 println,您将在调用该函数时看到它打印出来。

    【讨论】:

    • 谢谢!这很有帮助。
    • 补充:“RMIRegistry 是如何知道服务器正在侦听的端口的?”它嵌入在存根中。但它只需要知道用于 DGC 的目的,这些都是由 Registry JVM 中的 RMI 运行时系统执行的。 Registry 本身根本不需要知道端口。
    • 它指定您指定的任何端口,否则为零。操作系统提供随机端口本身,而不仅仅是范围。
    【解决方案2】:
    1. RMI 为它正在侦听的每个端口创建一个接受线程。仅当在相应端口上导出的所有远程对象都已显式或通过 DGC 取消导出时,这些线程才会退出。
    2. 它正在侦听您在构造或导出远程对象时指定的任何端口,或者如果您未指定 1 或指定 0,则侦听系统分配的端口。注册表不“知道”那是什么端口,但存根知道。
    3. 计算发生在导出远程对象的主机上,但通常该主机与注册表相同,因为很难(但并非不可能)将远程对象绑定到不同主机中的注册表。李>

    【讨论】:

      猜你喜欢
      • 2022-11-10
      • 1970-01-01
      • 2017-05-08
      • 2012-11-26
      • 2010-09-15
      • 1970-01-01
      • 2013-04-19
      • 2012-05-02
      • 2016-05-29
      相关资源
      最近更新 更多