tomcat启动项目LocateRegistry.createRegistry(9999)异常

本文记录了一次因端口9999冲突导致Linux虚拟机无法远程连接及Tomcat部署项目失败的经历。通过排查发现是Linux虚拟机与Java JMX服务争用同一端口所致,最终通过更改虚拟机端口解决了问题。
摘要由CSDN通过智能技术生成

昨天装了一个linux虚拟机,把虚拟机的端口设置成了9999,内部使用没问题,结果在windows环境下使用Xshell 6和Xftp连接linux虚拟机的时候,连接不上,不知道哪里出了问题,一直解决不了,搁置了。

今天关闭eclipse重启tomcat,tomcat正常启动,但是往tomcat里add项目的时候,凭直觉有明显的卡顿,add过程十分缓慢。更严重的是add完成之后,代码已经复制到tomcat规定目录,但是项目没有任何反应,没有生成启动会生成的缓存,完全没有启动。

由于启动日志跳的太快了,一直没有看清,最后复盘的时候才找到这个错误信息,一个LocateRegistry.createRegistry(9999)的异常。

查了一下,这是个java的jmx,一个为应用程序、设备、系统等植入管理功能的框架,它在Server start前必会 rmiregistry 9999 注册端口,或者LocateRegistry.createRegistry(9999)。

马上去查了下是谁占用了9999端口,

netstat -aon|findstr "9999" 查出占用端口号的进程的FID

tasklist|findstr "xxxx" 根据FID查询是哪个进程

一查,是linux虚拟机无疑。

最后删除了linux虚拟机,重新安装了一个其他端口的,问题解决,linux虚拟机也能连上了。

个人复盘的情形是这样的:

首先,我装了linux虚拟机,将端口号设置为9999。启动linux虚拟机,但是因为我当时启动着项目,9999占用中,所以linux不能呗外部连接,Xshell 6和Xftp连接失败。

然后,今天关闭了tomcat,清除了java的相关进程,jmx关闭。linux虚拟机一直保持后台状态,迅速占用了9999端口。导致重新启动tomcat时,jmx LocateRegistry.createRegistry(9999)异常,jmx启动失败。实际上这时候Xshell 6和Xftp应该能用了,但是我没有去尝试。

最后就是因为端口冲突,两败俱伤。

以后设置端口的时候,先netstat -aon|findstr "xxxx" 查一下端口有没有被使用吧。

 

 

web报表工具 请移步:http://download.csdn.net/source/2881508 不多说,除了RMI的学习外,gui对新手入门也是个不错的学习 /* *此类适合在本地注册的RMI服务器,避免了使用了多个DOS的写法,只需要简单的给使用 *本类提供的方法即可。 */ package common.rmiserver; import java.rmi.Naming; import java.rmi.NotBoundException; import java.rmi.Remote; import java.rmi.registry.Registry; import java.rmi.registry.LocateRegistry; //import java.rmi.RMISecurityManager; import java.rmi.RemoteException; import java.net.MalformedURLException; import java.rmi.server.UnicastRemoteObject; import common.zip.ZipClientSocketFactory; import common.zip.ZipServerSocketFactory; public final class RMIServer { private Registry registry = null; // @jve:decl-index=0: private String serverName = "RMIServer"; private String serverPath = "localhost"; private int port = 1099; private Remote serverInterface = null; private Boolean isStart = false; private AllFace dataAllFace = null; private int dataPort = 0;// 数据端口,0表示端口由RMI服务器动态生成. private Remote stub; public RMIServer() { } /* * 使用默认端口,默认服务器名称,服务路径构造函数 use the default port,server name and the url */ public RMIServer(Remote obj) { this.serverInterface = obj; } /* * 使用默认端口,服务路径构造函数 use the default port and server url */ public RMIServer(String servername, Remote obj) { this.serverName = servername; this.serverInterface = obj; } /* * 服务器为默认值的构造函数 use the default url */ public RMIServer(String servername, int port, Remote obj) { this.port = port; this.serverName = servername; this.serverInterface = obj; } /* * 适合1.4范围的版本,当然也适合5.0的版本 */ public Boolean setStart() throws RemoteException, MalformedURLException, NotImplementInterfaceException { if (registry == null) registry = LocateRegistry.createRegistry(port); if (serverInterface == null) { throw new NotImplementInterfaceException( "not found the reote interface method!!"); } Naming.rebind("rmi://"+serverPath + ":" + port + "/" + serverName, serverInterface); isStart = true; return isStart; } /* * jdk5.0以后的写法,在使用之前使用setXxx方法给对象赋值 */ public Boolean start() throws RemoteException, MalformedURLException, NotImplementInterfaceException { if(stub==null) stub = (Remote) UnicastRemoteObject.exportObject(dataAllFace, dataPort);// 0表示端口随机生成. if (registry == null) registry = LocateRegistry.createRegistry(port, new ZipClientSocketFactory(), new ZipServerSocketFactory()); setProperty(serverPath); //绑定IP registry.rebind(serverName, stub); isStart = true; return isStart; } /* * 如果有多个ip,则使用这个方法绑定指定的IP */ public void setProperty(String ip) { System.setProperty("java.rmi.server.hostname", ip); } /* * close the server */ public void close() throws RemoteException, MalformedURLException, NotBoundException { //UnicastRemoteObject.unexportObject(dataAllFace, true); Naming.unbind("rmi://"+serverPath + ":" + port + "/" + serverName); isStart = false; } /* * set server name,if not set the name,the service will use the default name * "RMIServer" */ public void setServerName(String serverName) { this.serverName = serverName; } /* * set the server URL,default localhost "rmi://localhost" */ public void setServerPath(String serverPath) { this.serverPath = serverPath; } /* * set the server port default port is 1099. */ public void setPort(int port) { this.port = port; } /* * set then remote implement method */ public void setServerInterface(Remote serverInterface) { this.serverInterface = serverInterface; } /* * set the server Security */ public void setSecurityManager() { /* if (System.getSecurityManager() == null) { try { // java -Djava.security.policy=policy.txt // common.rmiserver.RMIServer System.setSecurityManager(new RMISecurityManager());// 暂时不要安全设置, } catch (java.rmi.RMISecurityException exc) { throw exc; } }*/ } /* * set the remote method */ public void setDataAllFace(AllFace dataAllFace) { this.dataAllFace = dataAllFace; } /* * set the remote dataport */ public void setDataPort(int dataPort) { this.dataPort = dataPort; } // ----------------------------------------------- /* * return the server URL */ public String getServerPatth() { return serverPath; } /* * return remote method */ public Remote getserverInterface() { return serverInterface; } /* * return the server name */ public String getServerName() { return serverName; } /* * return the server use port */ public int getPort() { return port; } /* * return the server then action state */ public Boolean isStart() { return isStart; } /* * return remote method */ public AllFace getDataAllFace() { return dataAllFace; } /* * return remote dataport */ public int getDataPort() { return dataPort; } }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值