java - 仅在超时后在 Windows 上的相同或不同端口上重新启动 Java RMI 注册表

标签 java rmi

我有一个 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/

相关文章:

java - java中的静态方法调用栈

java - 内部类方法和私有(private)字段

java - 将线程分组以进行中断

java - Android 和桌面计算机之间的远程过程调用机制

java - 通过 HTTP 建立 RMI 隧道的最佳方式

java - 用 ConcurrentHashmap 替换所有出现的 Hashtable 是否安全?

java - 如何将自定义对象 ID 注入(inject) JPA 实体

java - 哪个 NIO 库(Netty、Grizzly、kryonet,...)用于 Java 中的简单后端服务器实现?

docker - 如何删除 <none> 标签而不删除 docker 镜像本身?

java - 数据交换格式和 Java 序列化