我已经检查了一些Java RMI示例。但它们都没有演示如何从潜在的服务器故障或RemoteException中恢复,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可能在这里被捕获。但经过一些实验,我发现它们实际上会出现在客户端,应该由客户端处理。
RMI服务器仅在UnicastRemoteObject.exportObject
或Naming.rebind
中初始化/启动时抛出该异常。这里的任何错误都可能无法通过运行循环再次执行相同的操作来恢复。还有其他一些问题需要调查。
如果服务器通过exportObject
/rebind
;服务器已启动";消息,执行通过catch块,main(String[] args)
正常结束。甚至线程处理CCD_ 6也可能到此结束。
但是,JVM进程不会退出,因为有非守护进程线程在运行。服务器中的任何异常都不会传递回main中显示的catch(RemoteException e)
块,因为main()
已经结束。
在实时系统中,我观察到开发人员用来解决RMI服务器问题的几种措施:
- 服务器启动脚本使用有限循环,在它死亡时重试启动(如果它在长时间后死亡,而不是立即失败,则更有效(
- 定期往返于rmi客户端到服务器的调用,使用琐碎的操作来证明rmi服务器的健康状况
- 在不同的时间运行多个rmi服务器实例,并进行有意的关闭-重新启动周期,以确保100%运行
- rmi服务器上的进程监视器=>触发手动干预警报
最重要的是,您需要有效的日志记录,这样您就可以诊断它后来死亡的原因。