我有一个 RMI 服务器,它发布一个对象,如下所示:
int port = ....;
String name = "...";
Remote server = UnicastRemoteObject.exportObject(someobject, port+1);
Registry registry = LocateRegistry.createRegistry(port);
registry.rebind(name, server);
log.info("created service name "+name+", on port "+(port+1)
+" in registry on port "+port);
当我停止程序并重新运行它时,它记录它已经创建了所有内容,但随后立即退出,可能是由于 rmi 服务器线程退出(最后一个非守护进程)。我注册了一个 defaultUncaughtExceptionHandler
,但没有从中记录任何内容。仅在一分钟左右后,我才能重新启动程序而不会立即退出。
如果我总是使用相同的端口,这只会让我感到惊讶,因为我知道端口在上次使用后可能会被阻塞一段时间。但即使我每次使用不同的端口(+100 左右),行为也是相同的。
有什么想法为什么会发生这种情况以及如何预防它吗?
最佳答案
您需要将createRegistry()
的结果存储到静态变量中。否则很容易被垃圾收集。
关于java - 仅在超时后在 Windows 上的相同或不同端口上重新启动 Java RMI 注册表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39576938/