我遇到了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链接。
答案 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目的,使注册表成为远程对象的客户端,使其保持活动状态。