Из-за чего может зависать работа с сетью в приложении на java?
Написал парсинг сайта, работающий через различные прокси. Все работает замечательно, но в какой то момент исполнение программы останавливается и висит так пока не перезагрузишь. Никаких ошибок или сообщений не выдается. Определил то место в коде, где все сотанавливается. Нижу указал проблемный кусок кода и строчку, где в какой-то момент останавливается исполнение. Может я некорректно очищаю ресурсы и закрываю соединения? Или может имеются другие проблемы? Куда можно копать для решения?
HttpsURLConnection conn = null;
BufferedReader in = null;
try {
System.setProperty("https.protocols", "TLSv1.1");
Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress(proxyMapItem.getLink(), proxyMapItem.getPort()));
conn = (HttpsURLConnection) new URL(link).openConnection(proxy);
conn.setRequestProperty("User-Agent", "Mozilla/4.0 (compatible; MSIE 5.5; Windows NT 5.0; H010818)");
// тут через некоторое время все подвисает !!!!!!
in = new BufferedReader(new InputStreamReader(conn.getInputStream()));
String strLine;
StringBuilder finalHTML = new StringBuilder();
while ((strLine = in.readLine()) != null) {
finalHTML.append(strLine);
}
doc = Jsoup.parse(finalHTML.toString());
connectFlag = true;
} catch (HttpStatusException e) {
System.out.println(e.getMessage());
} catch (IOException e) {
System.out.println(e.getMessage());
System.out.println(">>>>> Попробуем загрузить еще раз по ссылке: " + link);
} catch (Exception e) {
System.out.println(e.getMessage());
System.out.println(">>>>> Попробуем загрузить еще раз по ссылке: " + link);
} finally {
if (in != null) {
try {
in.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (conn != null) {
conn.disconnect();
}
}
1) Тут есть теги для кода.
2) Лучше используйте конструкцию try-with-resources
3) До конца не уверен т.к. желательно понять как именно приведенный код используется но сильно вероятно что проблема именно с ресурсами, что то закрыл или не открыл.
3.1) Еще не менее вероятно проблема в проксях, возможно дохлая прокси и соединение по таймауту не отшибается и тупо начинает ждать когда же он придет.
3.2) Проверяй responseCode . Сначало делаешь conn.connect(). затем conn.getResponseCode(). Смотри что бы код ответа был правильным.
3.3) Обязательно задай вручную таймаут conn.setConnectTimeout(милисекунд) и только после уже все манипуляции в т.ч. получение responseCode;
conn.getInputStream()
блокирующий вызов и будет висеть пока от сервера не придут какие-либо данные. Если сервер не отвечает, то и поток висит. Можно разрулить установкой таймаутов на чтение/коннект, а лучше освоить наконец NIO