Возникновение SocketTimeoutException происходит без остановки после некоторого времени работы приложения, но мгновенно решается путем его перезапуска - PullRequest
2 голосов
/ 08 января 2012

У меня есть приложение-обходчик Java, которое должно подключаться к некоторым HTTP-серверам, загружать содержимое HTML их страниц, а затем переходить на другие HTTP-серверы.Для этой задачи я использовал HTTP-библиотеку Apache.

В первые несколько часов работы кажется, что все работает довольно гладко (время от времени появляются некоторые связанные с подключением исключения, ноэтого следовало ожидать).Однако через некоторое время мне кажется, что я получаю исключение SocketTimeoutException при каждом отправляемом запросе.Исключение не возникает в методе «execute» класса HttpClient, а скорее, когда я пытаюсь получить содержимое Entity (которое я извлекаю из объекта HttpResponse), или когда я пытаюсь записать это содержимое в файл.

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

Я пытался найти все возможные варианты очистки, которые могут отсутствовать и которые могут быть необходимы при использовании этой библиотеки, но ничего не удалось найти.

Любая помощь будет принята с благодарностью.Спасибо.

Ответы [ 2 ]

1 голос
/ 08 января 2012

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

Если вы запускаете Wireshark для отслеживания вашего трафика, какой сетевой трафик происходит, пока он "сломан"?

0 голосов
/ 08 января 2012

Убедитесь, что вы не используете много запросов HTTP одновременно. Например, отправьте 5 HTTP-запросов и дождитесь первого ответа. Затем вы можете сделать еще один запрос и т. Д. Похоже, ваши http-запросы открывают слишком много сокетов.

...