我已经检查了一些Java示例。但是,它们都没有演示如何从我们定义的远程接口引发的潜在服务器故障或RemoteException中恢复。我也找不到任何相关的信息。
例如,
public static void main(String[] args)
{
try
{
Server server = new Server();
Hello stub = (Hello) UnicastRemoteObject.exportObject(server, 0);
Naming.rebind("rmi://localhost/Hello", stub);
System.out.println("Server is up.");
}
catch (RemoteException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
catch (MalformedURLException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
}异常被捕获后,服务器就会退出。在此,当引发此类异常时,服务器是否会死亡?我们能从这样的故障中恢复吗,比如重新启动服务器?但是怎么做呢?
谢谢,
为了澄清,最初我认为在远程接口中指定的RemoteException可能会在这里捕捉到。但是经过一些实验,我发现它们实际上会出现在客户端,应该由客户端来处理。
发布于 2022-10-13 12:12:24
您的RMI服务器只在UnicastRemoteObject.exportObject或Naming.rebind中的初始化/启动时抛出该异常。这里的任何错误都不可能仅仅通过运行一个循环来再次执行相同的操作就可以恢复。还有其他问题要调查。
如果服务器通过了exportObject/rebind,就会看到"Server“消息,执行将通过catch块,main(String[] args)将正常结束。甚至处理[main]的线程也可能在这里结束。
但是,JVM进程不会退出,因为有非守护进程线程正在运行。服务器中的任何异常都不会传递回主服务器中显示的catch(RemoteException e)块,因为main()已经结束。
在实时系统中,我观察到开发人员使用了几种措施来解决RMI服务器的问题:
instantly)
触发警报。
最重要的是,您需要有效的日志记录,这样您就可以诊断它后来死亡的原因。
https://stackoverflow.com/questions/74048113
复制相似问题