RMI:RMI Reaper线程,UnicastRemoteObject和Registry

时间:2016-07-24 06:32:20

标签: java rmi

我遇到了RMI Reaper线程的问题,因为这个线程不是守护进程,所以我的所有程序都不会终止。我发现只有当所有对象都未导出时,此线程才会停止。所以我有以下代码来创建rmi serer。

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

我有两个版本的" unsporting" 版本1:

UnicastRemoteObject.unexportObject(defaultServer, true);

第2版:

UnicastRemoteObject.unexportObject(registry, true);

当我使用版本2时 - RMI Reaper线程没有终止并且所有程序都没有终止。当我使用版本1一切都好。但是,在很多地方我发现了以下代码:

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

任何人都可以解释为什么以及如何将Registry与UnicastRemoteObject链接。

1 个答案:

答案 0 :(得分:2)

registry = LocateRegistry.createRegistry(2525);

导出注册表。

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

导出远程对象defaultServer

Ergo ,在取消导出时,你必须使用你提到的两行:

UnicastRemoteObject.unexportObject(defaultServer, true);

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

UnicastRemoteObject.unexportObject(registry, true);

取消您启动的注册表。

  

Registry如何与UnicastRemoteObject链接。

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