Apache Mina Server重启java.net.BindException:地址已在使用中

时间:2010-03-09 17:30:06

标签: java openjdk centos5 apache-mina

我的服务器应用程序中存在一个相当恼人的问题。

我使用以下代码绑定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。

提前感谢您提供有关如何解决此问题的任何想法。

6 个答案:

答案 0 :(得分:6)

我不确定根本原因,但我在某处读到了一个似乎对我有用的修复:

acceptor.setReuseAddress(true);

只需添加即可关闭并重新启动

答案 1 :(得分:3)

我想补充几件事:

  1. 将您的接受者设置为重复使用绑定地址
    acceptor.setReuseAddress(true)
  2. 在您的关闭区块中,而不是
    session.close(false)
    使用
    session.close(true)
    这将立即关闭会话,而不是等待同花。
  3. <强>参考文献:

    会话结束 - http://mina.apache.org/report/trunk/apidocs/org/apache/mina/core/session/IoSession.html#close(boolean

    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