我现在使用 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
没那么简单。
导出新端口上的第一个对象会创建一个监听该端口的线程,取消导出监听某个端口的最后一个对象会导致该线程退出。这适用于所有远程对象,而不仅仅是本地注册表对象。
取消导出可以通过本地 GC 自动发生,而本地 GC 又可以由远程 DGC 触发。
您的 JVM 退出是因为您没有将 LocateRegistry.createRegistry()
返回的值保存在静态变量中,所以它会被 GC 处理,所以对象不会被导出,所以没有远程对象在1099端口导出,所以监听1099的线程退出,所以没有非守护线程,所以JVM退出。
解决方案:将 LocateRegistry.createRegistry()
的结果存储在一个静态变量中。当您希望 JVM 退出时,您可以使用它来取消导出注册表。
关于java - RMI 服务器不会使用 LocateRegistry.createRegistry 方法线程化并终止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8042648/