4

サーバー アプリケーションで厄介な問題が発生しました。

次のコードで Apache Mina をバインドします。

acceptor.bind(new InetSocketAddress(PORT));

アクセプターは 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に精通しているわけではありませんが、どのように

netstat -apn | grep ポート
ps -ef | グレップジャバ

のように見える?

ああ、わかりました。root ユーザー権限でコマンドを打ちましたか?

于 2010-03-09T18:18:37.107 に答える