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: Address already in use

我也尝试了一个简单的 ioAcceptor.unbind() 但没有区别。该服务器运行在带有 OpenJDK 的 Centos 5 上。Apache Mina 版本是 2.0 RC1。

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

4

6 回答 6

6

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

acceptor.setReuseAddress(true);

只需添加让我关闭并重新启动

于 2011-01-17T17:52:38.513 回答
3

我要补充几点:

  1. 设置您的接受器以重用绑定地址
    acceptor.setReuseAddress(true)
  2. 在您的关闭块中,而不是
    session.close(false)
    利用
    session.close(true)
    这将立即关闭会话,而不是等待刷新。

参考:

会话关闭 - 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 )

于 2011-08-12T16:05:17.137 回答
0

您需要小心关闭,否则 TCP 会以这种方式运行。看到这个

于 2010-03-09T18:24:42.323 回答
0

不是我熟悉MINA,而是如何

网络统计-apn | grep 端口
ps -ef | grep java

看起来像?

哦好的。您是否以 root 用户权限点击了该命令?

于 2010-03-09T18:18:37.107 回答
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

于 2017-05-15T09:53:26.570 回答
0

添加以下代码:

acceptor.setReuseAddress(true)

这允许端口被重用。

于 2017-05-15T09:38:00.213 回答