我的服务器应用程序中存在一个相当恼人的问题。
我使用以下代码绑定Apache Mina:
acceptor.bind(new InetSocketAddress(PORT));
其中acceptor是NioSocketAcceptor。 通过HTTP接口,我可以关闭服务器,以便重新启动它。
Server.ioAcceptor.unbind(new InetSocketAddress(Server.PORT));
for(IoSession session: Server.ioAcceptor.getManagedSessions().values()){
if(session.isConnected() && !session.isClosing()){
session.close(false);
}
}
Server.ioAcceptor.dispose();
Main.transport.stop();
Logger.getRootLogger().warn("System going down. Request from "+context.getRemoteAddress());
System.exit(10);
这是我用来停止Mina服务器的代码。但是,如果我尝试在接下来的几分钟内再次启动服务器。 (大约在5分钟到15分钟之间)我在启动时遇到以下异常: java.net.BindException:已在使用的地址
我也试过一个简单的ioAcceptor.unbind(),但没有区别。 服务器在带有OpenJDK的Centos 5上运行。 Apache Mina版本是2.0 RC1。
提前感谢您提供有关如何解决此问题的任何想法。
答案 0 :(得分:6)
我不确定根本原因,但我在某处读到了一个似乎对我有用的修复:
acceptor.setReuseAddress(true);
只需添加即可关闭并重新启动
答案 1 :(得分:3)
我想补充几件事:
acceptor.setReuseAddress(true)
session.close(false)
使用session.close(true)
这将立即关闭会话,而不是等待同花。<强>参考文献:强>
ServerSocket重用地址 - http://download.oracle.com/javase/1.5.0/docs/api/java/net/ServerSocket.html?is-external=true#setReuseAddress(boolean)
答案 2 :(得分:0)
不是我熟悉MINA,但是怎么做
netstat -apn | grep PORT
ps -ef | grep的 的java
看起来像?
哦,好的。您是否使用root用户权限命中了该命令?
答案 3 :(得分:0)
您需要小心关闭,否则TCP会以这种方式运行。见this
答案 4 :(得分:0)
添加以下代码:
acceptor.setReuseAddress(true)
这允许重用端口。
答案 5 :(得分:0)
首先通过&#34; sysctl net.ipv4.tcp_fin_timeout&#34; 检查操作系统配置,然后将其修改为30秒;第二次&#34; sysctl -a | grep net.ipv4.tcp_tw&#34; ,修改这样的值 net.ipv4.tcp_tw_reuse = 1 net.ipv4.tcp_tw_recycle = 1