我有一个关于Java RMI的基本问题,我主要具有C ++背景,并且RMI还是有些不足。
需要明确的是,我能够使其正常运行,但这与程序的生命周期有关。
如果我有一个玩具Java程序,例如:
public class Test1 {
public static void main(String args[]) {
System.out.println( "start !" );
}
}
当我从shell运行它时,它会打印消息并退出。
如果要使用套接字,则需要在服务器中进行一些无限循环,该循环将等待传入连接,处理它们,然后重新开始。
ServerSocket socketserver = new ServerSocket( port_id );
System.out.println( "server: waiting" );
while(true) {
Socket socket = socketserver.accept();
System.out.println( "server: incoming connection" );
... do stuff...
socket.close();
}
现在,说我有一个具有以下
main()
方法的RMI服务器:public static void main(String args[]) throws Exception {
System.out.println( "RMI server started !" );
MyObject obj = new MyObject();
Naming.bind( "//localhost/myObject", obj );
System.out.println( "Done!" );
}
假设可以找到类
MyObject
,并且一切都可以编译。如果我从外壳程序运行此命令,则尽管它确实打印了最后一条消息并且在该行之后没有无限循环,但程序不会退出。
问题:
RMI API是否实现一些隐藏的无限循环,即等待传入连接?否则解释是什么?
如何以编程方式终止服务器?说是否要在“ x”秒后终止?
linked question回答第一个问题,但不回答第二个问题。 Oracle tutorial也不(除非我错过了?)
最佳答案
RMI为正在侦听的每个端口创建一个后台非守护程序线程。仅当显式地或通过DGC取消导出在其端口上导出的所有对象时,该线程才会退出。
取消导出远程对象,包括注册表(如果您在JVM中自己启动的话)。