我现在使用的是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退出时,可以使用它来取消导出注册表.