Попробуйте установить системное свойство -Dhttp.keepAlive = false в вашем приложении, если можете позволить себе отключить сохранение в других частях приложения. Это предотвратит некоторые зависания с внутренним классом Java HttpClient, который будет пытаться заполнить BufferedInputStream из открытого соединения.
Подробнее см. Также http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4479751.
Если это поможет вам взглянуть на трассировку стека вашего зависшего клиента, он должен выглядеть следующим образом:
java.lang.Thread.State: RUNNABLE
в java.net.SocketInputStream.socketRead0 (собственный метод)
в java.net.SocketInputStream.read (SocketInputStream.java:129)
at java.io.BufferedInputStream.fill (BufferedInputStream.java:218)
в java.io.BufferedInputStream.read1 (BufferedInputStream.java:258)
at java.io.BufferedInputStream.read (BufferedInputStream.java:317)
- заблокирован <0xab82fa30> (a java.io.BufferedInputStream)
на sun.net.www.http.HttpClient.parseHTTPHeader (HttpClient.java:687)
на sun.net.www.http.HttpClient.parseHTTP (HttpClient.java:632)
на sun.net.www.protocol.http.HttpURLConnection.getInputStream (HttpURLConnection.java:1072)
- заблокировано <0xab82c838> (sun.net.www.protocol.http.HttpURLConnection)
Параметр http.keepAlive, по сути, гарантирует, что HttpClient всегда будет отправлять сообщение «соединение: закрыть», как рекомендует HeavyWave.