最近做了一个RMI服务程序,Demo开发时候,发现,RMI服务程序总是无法终止退出运行,偶的JAVA很菜,郁闷啊!!!
IBM开发者网站找到的答案:
原文地址:http://www.ibm.com/developerworks/cn/java/j-rmiframe/
关闭RMI服务
您需要一个彻底的方式来关闭服务器而不要管正在处理的请求。因为RMI 运行时包含从不结束的线程,所以结束 RMI 服务器的唯一的方式是计划性的使用一个系统退出方法或是使用一个操作系统清除。后者是最粗野的,而且要求手工的干预。
关闭 RMI 服务器的得体的方式是用一个关闭方法。但是,如果关闭方法仅结束 Java Virtual Machine,那么该方法的返回消息从不会返回客户机。更好的方式是启动一个关闭线程。该线程休眠大约两秒的时间来给线程的返回消息一个清除虚拟机的机会,然后发出
System.exit(0).
public class HelloServer implements Runnable {
public static Registry registry = null;
private static boolean runFlag = true;
public static void main(String args[]) {
new HelloServer().run();
}
public static void stop() throws RemoteException{
runFlag = false;
}
@Override
public void run() {
try {
//创建一个远程对象
IHello rhello = new HelloImpl();
//本地主机上的远程对象注册表Registry的实例,并指定端口为8888,这一步必不可少(Java默认端口是1099),必不可缺的一步,缺少注册表创建,则无法绑定对象到远程注册表上
registry = LocateRegistry.createRegistry(8888);
//把远程对象注册到RMI注册服务器上,并命名为RHello
Naming.bind("rmi://localhost:8888/RHello",rhello);
System.out.println(">>>>>INFO:远程IHello对象绑定成功!");
while(runFlag){
;
}
registry.unbind("RHello");
UnicastRemoteObject.unexportObject(registry, true);
System.out.println(">>>>>INFO:服务停止!");
System.exit(0); //终止RMI服务程序的运行
} catch (RemoteException e) {
System.out.println("创建远程对象发生异常!");
e.printStackTrace();
} catch (AlreadyBoundException e) {
System.out.println("发生重复绑定对象异常!");
e.printStackTrace();
} catch (MalformedURLException e) {
System.out.println("发生URL畸形异常!");
e.printStackTrace();
} catch (NotBoundException e) {
e.printStackTrace();
}
}
}