Абсурдное время ожидания соединения в HttpURLConnection в Java - PullRequest
3 голосов
/ 08 июня 2010

В одном из моих приложений мы подключились к другому серверу с помощью HttpURLConnection - приложение работало отлично в течение нескольких месяцев, и теперь внезапно все обращения сталкиваются с таймаутом соединения. Периодически несколько вызовов (1 из 500) завершаются успешно, в то время как все остальные не выполняются. Приложение развернуто в Linux, работающем на Java 5 с Tomcat 5.5. Я пробовал curl и wget из командной строки, которые работают нормально.

Другой процесс Java, использующий точно такую ​​же кодовую базу, может устанавливать соединения из командной строки. Мы перезапустили сервер Tomcat, а также компьютер, но безрезультатно. Мы тщательно проверили машину, и никакие блокирующие процессы / брандмауэры не препятствуют этому (очевидно, что другие процессы Java могут устанавливать соединения).

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

Какие-нибудь предложения, где это могло бы пойти не так?

[Обновить] В случае, если DNS сервера изменяется во время работы приложения, Java не подхватит это, и соединения прекратят работу со старого IP (учитывая, что IP не работает). Таким образом, в случае CDN, если узел выходит из строя и его заменяют другим IP, может возникнуть проблема.

1 Ответ

5 голосов
/ 08 июня 2010

У меня была такая же проблема, и она была вызвана обработкой keepalive HttpURLConnection. Проблема исчезла, когда мы отключили keepalive, установив это системное свойство,

http.keepAlive=false

У нас есть еще одна проблема, связанная с брандмауэром. Если целевой URL заблокирован брандмауэром, это займет много времени (более 2 минут). Мы должны запустить все наше соединение HttpURLConnection в другом потоке, чтобы мы могли прервать его через несколько секунд.

...