Apache Mina服务器重启遇到java.net.BindException:地址已被占用

4

我在我的服务器应用程序中遇到了一个非常烦人的问题。

我使用以下代码绑定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(),但没有任何区别。 该服务器在Centos 5上运行,使用OpenJDK。Apache Mina版本为2.0 RC1。
提前感谢您对如何解决此问题的任何想法。
6个回答

6
我不确定根本原因,但我在某个地方读到了一个解决办法,对我来说似乎有效:

acceptor.setReuseAddress(true);

简单地添加这个命令让我能够关闭和重新启动


3
我有几点需要补充:

  1. Set your acceptor to reuse the bound address
    acceptor.setReuseAddress(true)
  2. In your close block, instead of
    session.close(false)
    use
    session.close(true)
    This will close the session immediately instead of waiting for a flush.

参考资料:

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

服务器套接字重用地址 - http://download.oracle.com/javase/1.5.0/docs/api/java/net/ServerSocket.html?is-external=true#setReuseAddress(boolean)


0

虽然我对MINA不太熟悉,但是这个命令:

netstat -apn | grep PORT
ps -ef | grep java

看起来是怎样的呢?

哦,好的。你使用root用户权限运行了这个命令吗?


它们都没有显示任何内容。"lsof -i" 也没有显示该端口上的连接。 - Kosaki

0

在编程中,你需要小心处理close操作,否则TCP会表现出这种行为。请参见this


谢谢。我现在正在尝试,但必须等待结果。有什么想法可以在不将其放在生产服务器上的情况下进行测试吗?我通常会打开大约2000个套接字,很难在测试环境中复制。 - Kosaki

0

首先通过"sysctl net.ipv4.tcp_fin_timeout"检查操作系统配置,然后将其修改为30秒;其次"sysctl -a|grep net.ipv4.tcp_tw",修改值如下 net.ipv4.tcp_tw_reuse = 1 net.ipv4.tcp_tw_recycle = 1


0

添加以下代码:

acceptor.setReuseAddress(true)

这将允许端口被重复使用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接