日期:2014-05-17  浏览次数:20729 次

linux下rmi与TomCat问题
情况是这样的,我在做一个分布式资源检索的题目,用到rmi
在linux上,我用myecplise启动tomcat正常,但是stop server时很慢,优势等不及了,再按一次stop会报错,
虽然这样,但下次仍然可以在myeclipse里启动tomcat,正常运行

当我仅在tomcat用startup.sh里运行第一次可以正常启动,然后关闭,让后就发现rmi线程依然占着1099端口,再启动的rmi就报错了。。。。


错误如下:
RemoteException:
java.rmi.server.ExportException: Port already in use: 1099; nested exception is
java.net.BindException: Address already in use
at sun.rmi.transport.tcp.TCPTransport.listen(TCPTransport.java:310)
at sun.rmi.transport.tcp.TCPTransport.exportObject(TCPTransport.java:218)
at sun.rmi.transport.tcp.TCPEndpoint.exportObject(TCPEndpoint.java:393)
at sun.rmi.transport.LiveRef.exportObject(LiveRef.java:129)
at sun.rmi.server.UnicastServerRef.exportObject(UnicastServerRef.java:190)

总结,最好有高人告诉我怎么用java代码解决,实在不行,linux命令行,怎么强制kill占用1099的rmi线程

ps这段代码不太行,ubuntu上。

public void destroy() {
// TODO Auto-generated method stub
super.destroy();
listenThread.stopThis();
try {
Naming.unbind("rmi://" + ServersUtil.localIP + ":1099/searcher");
Naming.unbind("rmi://" + ServersUtil.localIP + ":1099/server");
} catch (RemoteException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (NotBoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("服务器即将关闭:正在清理rmi与多线程");
}

------解决方案--------------------
netstat -Aan | grep 1099

如果知道进程名称 也可以用 

ps -ef| grep 进程名称

杀死进程
kill -9 进程号

如果有发帖时间上搜索引擎就可以查到资料了、

你tomcat关闭的时候没有把rmi的注册进程给关闭、

可以试一下这两个方法可以关闭端口:

UnicastRemoteObject.unexportObject
PortableRemoteObject.unexportObject