Перезапуск сервера Apache Mina java.net.BindException: адрес уже используется - PullRequest
4 голосов
/ 09 марта 2010

У меня довольно раздражающая проблема в приложении на сервере.

Я связываю 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: адрес уже используется

Я также попробовал простой ioAcceptor.unbind (), но не было никакой разницы. Сервер работает на Centos 5 с OpenJDK. Версия Apache Mina - 2.0 RC1.

Заранее спасибо за любые идеи, как решить эту проблему.

Ответы [ 6 ]

6 голосов
/ 17 января 2011

Я не уверен в основной причине, но я где-то читал исправление для этого, которое, кажется, работает для меня:

acceptor.setReuseAddress(true);

Простое добавление, которое позволяет мне выключить и перезапустить

3 голосов
/ 12 августа 2011

Я бы добавил пару вещей:

  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)

0 голосов
/ 15 мая 2017

Сначала проверьте конфигурацию ОС с помощью "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 голосов
/ 15 мая 2017

Добавьте следующий код:

acceptor.setReuseAddress(true)

Это позволяет повторно использовать порт.

0 голосов
/ 09 марта 2010

Вы должны быть осторожны с закрытием, иначе TCP ведет себя таким образом. Смотри это

0 голосов
/ 09 марта 2010

Не то, чтобы я был знаком с MINA, но как работает

netstat -apn | grep PORT
ps -ef | Grep Java

похож?

О, хорошо. Вы нажали на команду с привилегиями пользователя root?

...