加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java – RMI Server不会使用LocateRegistry.createRegistry方

发布时间:2020-12-15 01:07:06 所属栏目:Java 来源:网络整理
导读:我现在使用的是LocateRegistry.createRegistry(1099)而不是在外部进程中使用注册表.但是,在主程序结束后,注册表将会死亡.例如,如果我创建一个创建注册表的简单程序,它将无法工作,因为在main executino之后代码结束.我期待LocateRegistry代码创建一个线程,但

我现在使用的是LocateRegistry.createRegistry(1099)而不是在外部进程中使用注册表.但是,在主程序结束后,注册表将会死亡.例如,如果我创建一个创建注册表的简单程序,它将无法工作,因为在main executino之后代码结束.我期待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

这不是那么简单.

>导出新端口上的第一个对象会创建一个侦听该端口的线程,并且取消导出侦听端口的最后一个对象会导致该线程退出.这适用于所有远程对象,而不仅仅是本地Registry对象.
>取消导出可以通过本地GC自动发生,而本地GC又可以由远程DGC触发.

您的JVM退出是因为您没有将LocateRegistry.createRegistry()返回的值保存在静态变量中,因此它获取GC,因此对象未被导出,因此端口1099上没有导出远程对象,因此该线程监听1099个出口,因此没有非守护进程线程,因此JVM退出.

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读