gpt4 book ai didi

java - RMI 注册表生命周期、GC 等

转载 作者:搜寻专家 更新时间:2023-11-01 03:56:00 24 4
gpt4 key购买 nike

在看了 Sun RMI 教程之后,我一直在做一个内部 Java RMI 教程练习,我只是有点明白发生了什么。有几件事对我来说似乎很奇怪,在我对教程提供反馈之前我想知道到底发生了什么。

教程让我编写了以下组件:

  • 一个接口(interface),比如 RemoteInterface,带有我们想要远程访问的方法。
  • 一个类,比如 RemoteServer,实现 RemoteInterface,在其构造函数中:
    • 通过调用 LocateRegistry.createRegistry(PORTNO) 创建一个 Registry 对象
    • 通过调用 UnicastRemoteObject.exportObject(this, PORTNO) 并转换结果来创建 stub RemoteInterface 对象。
    • 使用 registry.rebind(BINDNAME, stub) 将 stub 绑定(bind)到注册表
  • 一个类,比如 ServerDemo,它有一个主要方法,它只创建 RemoteServer 的一个实例。
  • 使用 BINDNAME 调用服务器的客户端类,一切正常。

首先,我注意到:

  • 服务器在主方法完成后继续运行。我必须明确终止它。在我看来,它应该只是创建一个对象然后完成,但程序不会终止并且客户端仍然可以连接。
  • 如果我在 RemoteServer 构造函数中调用 registry.unbind(BINDNAME),客户端将停止工作,但服务器仍不会终止。
  • 如果我在 RemoteServer 构造函数中调用 UnicastRemoteObject.unexportObject(this, true);,服务器会立即终止。

我想知道为什么会这样 - 如果不是这样,服务器将毫无用处,因为它会立即终止。 (在我的反馈中,我建议为 RemoteServer 提供绑定(bind)和解除绑定(bind)方法以供 ServerDemo 调用,而不是在构造函数中执行所有绑定(bind),从不解除绑定(bind),并且出于某种原因依赖服务器继续运行 - 但首先我'我想知道为什么会这样。)

其次,我注意到我可以调用 UnicastRemoteObject.exportObject(this, PORTNO) before calling LocateRegistry.createRegistry(PORTNO) 和一切仍然有效。我假设必须先设置注册表,然后才能导出到它,但显然它并不像我想的那样工作。

我想知道一些关于 exportObject 实际如何工作的信息。(我想这与前一点有关 - 为什么导出对象会阻止程序结束?)

此外,如果我在一种方法中导出和绑定(bind)一个 stub ,准备在另一种方法中取消导出和解除绑定(bind),我想知道我是否需要显式保留对 stub 的引用之间。 (只有 BINDNAME 是解除绑定(bind)所必需的。)我的一位同事报告了 GC 问题,虽然我自己没有注意到任何问题,但我不能排除它们的可能性,因为我并不真正了解发生了什么。

最佳答案

默认情况下,RMI 通过为每个导出的对象运行一个 TCP 服务器来工作。该服务器监听您提供的端口并等待是否有客户端连接到那里,然后执行调用的方法。

因此,您实际上让另一个线程监听此 ServerSocket,这会阻止您的应用程序退出(当没有非后台线程在运行时,Java VM 会退出)。

事实上,这与您的注册表完全没有关系,在您的情况下似乎根本没有使用它。

关于java - RMI 注册表生命周期、GC 等,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4886280/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com