java - 为什么服务器程序不退出?

标签 java rmi

我有一个关于 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,并且一切都可以正常编译。

如果我从 shell 运行此命令,那么虽然它确实打印最后一条消息,并且该行之后没有无限循环,但程序不会退出。

问题:

  • RMI API 是否实现了一些隐藏的无限循环,即等待传入连接?不然怎么解释?
  • 如何以编程方式终止服务器?说我是否希望它在“x”秒后终止?

linked question回答了第一个问题,但没有回答第二个问题。 Oracle tutorial 也没有(除非我错过了?)

最佳答案

  1. RMI 为其监听的每个端口创建一个后台非守护线程。仅当显式或通过 DGC 取消导出在其端口上导出的所有对象时,该线程才会退出。
  2. 取消导出远程对象,包括注册表(如果您自己在 JVM 中启动它)。

关于java - 为什么服务器程序不退出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35676355/

相关文章:

java - 我们可以将 Spark 流用于基于时间的事件吗

java - 我是否需要客户端、服务器和注册表上的所有类才能使 RMI 工作?

java - 如何拒绝客户端解除RMI注册中心的绑定(bind)?

java - 外部java程序: Handle SIGTERM

java - 我可以针对另一个数据库模式使用 JOOQ 生成的代码吗?

java - 为什么渲染响应阶段使用旧数据?

Java:将作业发送到服务器执行

java - Spring RMI刷新StubOnConnectFailure不工作

java.rmi.ServerException : RemoteException occurred in server thread (ClassNotFoundException)

java - 如何正确使用具有多个值的枚举