RMI:RMI Reaper线程、UnicastRemoteObject和Registry

RMI: RMI Reaper thread, UnicastRemoteObject and Registry

我的 RMI Reaper 线程有问题,它不允许我的所有程序终止,因为该线程不是守护进程。我发现只有当所有对象都未导出时该线程才会停止的信息。所以我有以下代码来创建 rmi serer。

registry = LocateRegistry.createRegistry(2525);
Server stub = (Server) UnicastRemoteObject.exportObject(defaultServer, 2525);
registry.rebind("//localhost/server", stub);

我有两个版本的"unexporting"。
版本 1:

UnicastRemoteObject.unexportObject(defaultServer, true);

版本 2:

UnicastRemoteObject.unexportObject(registry, true);

当我使用版本 2 时 - RMI Reaper 线程不会终止并且所有程序都不会终止。当我使用版本 1 时一切正常。然而,在很多地方我发现了以下代码:

UnicastRemoteObject.unexportObject(rmiRegistry, true); // Stop the RMI registry

任何人都可以解释注册表与 UnicastRemoteObject 链接的原因和方式。

registry = LocateRegistry.createRegistry(2525);

导出注册表。

Server stub = (Server) UnicastRemoteObject.exportObject(defaultServer, 2525);

导出您的远程对象defaultServer

因此,当不导出时,你必须同时使用你提到的两行:

UnicastRemoteObject.unexportObject(defaultServer, true);

取消导出您自己的远程对象,并且

UnicastRemoteObject.unexportObject(registry, true);

取消导出您启动的注册表。

how Registry is linked with UnicastRemoteObject.

您将远程对象绑定到注册表中。出于 DGC 的目的,使注册表成为远程对象的客户端,从而使其保持活动状态。