Tomcat中部署的应用关闭后,监听线程没有关闭,仍旧占用端口
因为业务需要,要在原有的系统上面添加一个对外接口,监听并接受外部发送过来的报文。
然后我第一时间想到的就是Socket。然后试了试在写了个类,并在application.xml中配置了bean,结果发现会阻塞应用,导致应用无法成功启动,然后我就在这个里面又用到了线程,能够顺利启动,而且能够完成需求 。但是问题是ServerSocket.accept()这个方法会占用端口,即使在关闭应用之后还是占用这个端口,结果就导致重新启动应用会失败。
想问一下各位大神,有没有好的解决方案或者替代方案,再次谢谢大家了。
贴上代码:
public class MessageServer implements Runnable {
private Logger logger = LoggerFactory.getLogger(MessageServer.class);
private static ServerSocket serverSocket ;
public void init(){
try{
serverSocket = new ServerSocket(2000);
} catch (IOException e) {
logger.error("启动用户验证服务失败",e);
throw new RuntimeException("启动用户验证服务失败");
}
new Thread(this).start();
}
@Override
public void run() {
while(true){
Socket socket = null;
try {
while((socket = serverSocket.accept()) != null ){
new Thread(new UserCheckServer(socket)).start();
}
} catch (IOException e) {
logger.error("连接失败",e);
}
}
}
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(5)
不是关闭tomcat之后端口还占用 ,是关闭部署在tomcat中的应用之后端口还是占用着,要是关闭tomcat的话,端口就关闭成功了。但是这个tomcat服务器中还有其他应用,所以就不能为了启动这个应用重启tomcat 了
回复
你的意思是应用停止之后你那个线程还活着?把他设置为守护线程试试
回复
@zheng_pat : 这个 要怎么设置呢 ?没用过 守护线程
回复
thread.setDaemon(true)
只要java进程呗关闭,理论上不会出现端口被占用。你确定tomcat服务停止之后,没有任何java进程,但是端口仍然在的吗