java - RMI 服务器不会使用 LocateRegistry.createRegistry 方法线程化并终止

标签 java rmi

我现在使用 LocateRegistry.createRegistry(1099) 而不是在外部进程中使用注册表。然而,注册表在主程序结束后就消失了。例如,如果我制作一个创建注册表的简单程序,它将无法工作,因为在主执行程序之后代码结束。我期待 LocateRegistry 代码创建一个线程,但似乎并非如此。这是使用 LocateRegistry 的正常行为还是我遗漏了什么?

代码示例:

// ommited imports

public class RMITest {
    public static void main(String[] args) {
        LocateRegistry.createRegistry(1099);
        // JVM will exit now!!!
    }
}

RMI 服务器启动并突然死掉。如何

最佳答案

I was expecting the LocateRegistry code to create a thread

没那么简单。

  1. 导出新端口上的第一个对象会创建一个监听该端口的线程,取消导出监听某个端口的最后一个对象会导致该线程退出。这适用于所有远程对象,而不仅仅是本地注册表对象。

  2. 取消导出可以通过本地 GC 自动发生,而本地 GC 又可以由远程 DGC 触发。

您的 JVM 退出是因为您没有将 LocateRegistry.createRegistry() 返回的值保存在静态变量中,所以它会被 GC 处理,所以对象不会被导出,所以没有远程对象在1099端口导出,所以监听1099的线程退出,所以没有非守护线程,所以JVM退出。

解决方案:将 LocateRegistry.createRegistry() 的结果存储在一个静态变量中。当您希望 JVM 退出时,您可以使用它来取消导出注册表。

关于java - RMI 服务器不会使用 LocateRegistry.createRegistry 方法线程化并终止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8042648/

相关文章:

java - 如何使用java搜索json文件中的任意单词

java - 使用 Hibernate + Javassist + Gilead 时出现 "Duplicate method"错误

java - 当下载本地不存在类文件的对象时,RMI 如何定位类?

java - 压缩要通过 RMI 发送的 Java HashMap

java - 在 Java 中以原子方式释放多个锁

java - RedisClusterClient,一连接或一线程一连接

java - 正则表达式优化问题

java - 可扩展 POJO 远程服务到内部 Java 客户端,无需 RMI

java - java中如何存储rmi连接?

java - 如何将位于 NAT 后面的 ActiveMQ 客户端连接到不在 NAT 后面的服务器?