RMI 服务器在一段时间后终止
RMI server terminates after a while
我 运行 我的 Eclipse 测试 RMI 服务器。
目前,它只包含我的 RMI 接口 (IRDSA) 的实现和很少的方法,以及在这个 main 中实现的服务器本身:
(使用私有端口号)
static Registry registry;
public static void main(String[] args) {
// start Registry
try {
registry = LocateRegistry.createRegistry(RMI_PORT);
} catch (ExportException exp) {
System.out.format ("RMI Registry (Port %d) already active. Providing", RMI_PORT);
try {
Registry existingReg = LocateRegistry.getRegistry(RMI_PORT);
String[] bound = existingReg.list();
for (String entry : bound)
System.out.println (entry);
} catch (RemoteException e) {
e.printStackTrace();
}
return;
} catch (RemoteException e) {
e.printStackTrace();
return;
}
try {
IRDSA server = new RDSAServer();
IRDSA stub = (IRDSA) UnicastRemoteObject.exportObject(server, 0);
// Bind the remote object's stub in the registry
registry.bind(RMI_NAME, stub);
System.out.println("RDSAServer ready");
} catch (Exception e) {
System.err.println("RDSAServer exception: " + e.toString());
e.printStackTrace();
}
}
}
为了进行测试,我启动了一个本地客户端,它很好地执行了这些方法。
这可以重复并且服务器保持活动状态,无论 main 已经完成。
但是过了一会儿,即使我保持客户端连接(在休息时暂停),当我 return 吃午饭时,客户端仍然暂停,但服务器静默终止。
什么时候发生,我该如何避免?
发现了一个类似的问题,注册表应该是静态的(这里是)
我必须保持 main 存活吗?
还有什么吗?
您的服务器应用程序仅包含启动和绑定 RMI 服务器的主要方法。 RMI-Server 只会在存在客户端调用的存根实例时存在。如果它们被垃圾收集,服务器将被 JVM 关闭。
为简单起见,您可以在主方法中使用循环,这样主线程就不会结束,同时您的 RMI 服务器也将保持活动状态。
希望这对你有帮助,
Java 远程方法调用 (Java RMI) 是一个 Java API 执行远程方法调用,远程过程调用 (RPC) 的面向对象等价物,支持用于直接传输序列化 Java 类 和分布式垃圾收集。
我 运行 我的 Eclipse 测试 RMI 服务器。 目前,它只包含我的 RMI 接口 (IRDSA) 的实现和很少的方法,以及在这个 main 中实现的服务器本身: (使用私有端口号)
static Registry registry;
public static void main(String[] args) {
// start Registry
try {
registry = LocateRegistry.createRegistry(RMI_PORT);
} catch (ExportException exp) {
System.out.format ("RMI Registry (Port %d) already active. Providing", RMI_PORT);
try {
Registry existingReg = LocateRegistry.getRegistry(RMI_PORT);
String[] bound = existingReg.list();
for (String entry : bound)
System.out.println (entry);
} catch (RemoteException e) {
e.printStackTrace();
}
return;
} catch (RemoteException e) {
e.printStackTrace();
return;
}
try {
IRDSA server = new RDSAServer();
IRDSA stub = (IRDSA) UnicastRemoteObject.exportObject(server, 0);
// Bind the remote object's stub in the registry
registry.bind(RMI_NAME, stub);
System.out.println("RDSAServer ready");
} catch (Exception e) {
System.err.println("RDSAServer exception: " + e.toString());
e.printStackTrace();
}
}
}
为了进行测试,我启动了一个本地客户端,它很好地执行了这些方法。 这可以重复并且服务器保持活动状态,无论 main 已经完成。 但是过了一会儿,即使我保持客户端连接(在休息时暂停),当我 return 吃午饭时,客户端仍然暂停,但服务器静默终止。
什么时候发生,我该如何避免?
发现了一个类似的问题,注册表应该是静态的(这里是)
我必须保持 main 存活吗?
还有什么吗?
您的服务器应用程序仅包含启动和绑定 RMI 服务器的主要方法。 RMI-Server 只会在存在客户端调用的存根实例时存在。如果它们被垃圾收集,服务器将被 JVM 关闭。
为简单起见,您可以在主方法中使用循环,这样主线程就不会结束,同时您的 RMI 服务器也将保持活动状态。
希望这对你有帮助, Java 远程方法调用 (Java RMI) 是一个 Java API 执行远程方法调用,远程过程调用 (RPC) 的面向对象等价物,支持用于直接传输序列化 Java 类 和分布式垃圾收集。