【问题标题】:RMI: RMI Reaper thread, UnicastRemoteObject and RegistryRMI:RMI Reaper 线程、UnicastRemoteObject 和 Registry
【发布时间】:2016-07-24 06:32:19
【问题描述】:

我的 RMI Reaper 线程有问题,它不允许我的所有程序终止,因为该线程不是守护程序。我发现该线程仅在未导出所有对象时才停止的信息。所以我有以下代码来创建rmi serer。

registry = LocateRegistry.createRegistry(2525);
Server stub = (Server) UnicastRemoteObject.exportObject(defaultServer, 2525);
registry.rebind("//localhost/server", stub);

我有两个版本的“未导出”。
版本 1:

UnicastRemoteObject.unexportObject(defaultServer, true);

版本 2:

UnicastRemoteObject.unexportObject(registry, true);

当我使用版本 2 时 - RMI Reaper 线程不会终止并且所有程序都不会终止。当我使用版本 1 时一切正常。但是,在很多地方我发现了以下代码:

UnicastRemoteObject.unexportObject(rmiRegistry, true); // Stop the RMI registry

谁能解释一下 Registry 为何以及如何与 UnicastRemoteObject 链接。

【问题讨论】:

    标签: java rmi


    【解决方案1】:
    registry = LocateRegistry.createRegistry(2525);
    

    导出一个注册表。

    Server stub = (Server) UnicastRemoteObject.exportObject(defaultServer, 2525);
    

    导出你的远程对象defaultServer

    Ergo,取消导出时,您必须使用您提到的两行:

    UnicastRemoteObject.unexportObject(defaultServer, true);
    

    取消导出您自己的远程对象,并且

    UnicastRemoteObject.unexportObject(registry, true);
    

    取消导出您启动的注册表。

    Registry 如何与 UnicastRemoteObject 链接。

    您将远程对象绑定到注册表中。出于 DGC 目的,使 Registry 成为远程对象的客户端,从而使其保持活动状态。

    【讨论】:

    • 我可以通过 UnicastRemoteObject.exportObject 导出注册表吗?
    • 不,因为您无法构造所需类的对象并为其提供所需的 RMI 对象 ID。
    • 但是为什么当我不取消导出注册表时,RMI 收割线程没有问题?这是否意味着该注册表会自动导出和取消导出?
    • 它是由createRegistry() 导出的,不是自动的,但是如果你的registry 变量不是静态的,它可以自动unexported,所以它可以是本地垃圾-收集。
    • 如何判断是否是静态的?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-12
    • 2023-02-03
    • 2023-03-04
    • 2016-10-22
    • 2022-12-03
    • 2019-07-21
    相关资源
    最近更新 更多