Простая открытая розетка висит очень редко - PullRequest
3 голосов
/ 22 января 2010

У меня есть довольно простой кусок кода, который висит в Java. Зависание ОЧЕНЬ нечасто. Может быть, порядка раз в 1000 казней. Запуск его в цикле на устройстве, похоже, не воспроизводит проблему.

long timeout = 10000;
long endTime = System.currentTimeMillis() + timeout + 5000;
Socket pingSocket = null;
String host = "host";
String port = "22";

do {

    try {
        pingSocket = new Socket();
        pingSocket.bind(null);
        pingSocket.connect(new InetSocketAddress(host, port), 5000);
        if (pingSocket.isConnected()) {
            pingSocket.close();
            return true;
        }
        pingSocket.close();
    }
    catch (UnknownHostException e) {
        throw e;
    }
    catch (IOException e) {
        // All other errors are subclassed from IOException, and i want
        // to ignore till after my spin period.
    }

    try {
        Thread.sleep(SPIN_SLEEP_DELAY);
    }
    catch (InterruptedException e) {
        return false;
    }

} while (System.currentTimeMillis() <= endTime);

Поскольку в производстве это случается так редко, трудно определить причину проблемы. В настоящее время я работаю над созданием кода, чтобы в следующем выпуске нашего продукта было больше информации, когда это произойдет, но я подумал, что могу спросить, видел ли кто-нибудь простой зависание bind / connect / isConnected / close? 1004 *

Спасибо!

Ответы [ 2 ]

3 голосов
/ 22 января 2010

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

2 голосов
/ 24 января 2010

Я читал, что если сокет не может соединиться, то вызывающий код все равно должен закрыть его, прежде чем продолжить (не могу найти ссылку сейчас). В противном случае ресурсы все еще потребляются, и будущие попытки открыть сокеты могут зависнуть.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...