Иногда HttpURLConnection.getInputStream выполняется слишком медленно - PullRequest
9 голосов
/ 17 декабря 2009

У нас есть следующий код.
Иногда нам нужно подождать 10-20-40 секунд на последней строке.
В чем может быть проблема?

Java 1.4

URL url = ...;
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setDoInput(true);
conn.setDoOutput(true);
conn.setUseCaches(false);
conn.connect();
OutputStream out = conn.getOutputStream();
ObjectOutputStream outStream = new ObjectOutputStream(out);
try
{
   outStream.writeObject(objArray);
}
finally
{
   outStream.close();
}

InputStream input = conn.getInputStream();

ОБНОВЛЕНИЕ:
Следующий код решает проблему ЗАТМЕНИЕМ.
Но он все еще не работает через Java WebStart: (

HttpURLConnection conn = (HttpURLConnection) url.openConnection();  
conn.setDoInput(true);  
conn.setDoOutput(true);  
conn.setUseCaches(false);  
System.setProperty("http.keepAlive", "false");  //<---------------
conn.connect();  

Но почему?

ОБНОВЛЕНО еще раз!
Ошибка была исправлена! :)

Мы работали со связями не в одном классе, а в двух.
И во втором классе есть следующая строка:

URL url = ...  
HttpURLConnection conn = (HttpURLConnection) url.openConnection();  
conn.setRequestProperty("Content-Length", "1000");  //<------------
conn.connect();  

Примечание: setRequestProperty("Content-Length", "1000") является основной причиной проблемы.

Ответы [ 6 ]

10 голосов
/ 17 декабря 2009

'У нас была похожая проблема, вызванная ошибкой поддержки активности в старой Java. Добавьте это перед подключением, чтобы увидеть, поможет ли это,

conn.setRequestProperty("Connection", "close");

или

System.setProperty("http.keepAlive", "false");
4 голосов
/ 21 ноября 2012

Была такая же проблема, обнаружил, что это вызвано IPv6.

Вы отключите его из кода, используя:

System.setProperty("java.net.preferIPv4Stack" , "true");

Вы также можете отключить его через командную строку, используя: g-Djava.net.preferIPv4Stack=true

2 голосов
/ 17 октября 2016

У меня была такая же проблема, поэтому я перехожу на HTTPClient из Apache, следуйте примеру:

HttpClient httpClient = HttpClientBuilder.create().build();

HttpPost request = new HttpPost("www.myurl-to-read");

RequestConfig requestConfig = RequestConfig.custom()
                              .setSocketTimeout(8000)
                              .setConnectTimeout(10000)
                              .setConnectionRequestTimeout(1000)
                              .build();

request.setConfig(requestConfig);

request.setHeader("Content-type", "application/json");

HttpResponse  response = httpClient.execute(request);

HttpEntity entity = response.getEntity();
String result = EntityUtils.toString(entity, "UTF-8");
2 голосов
/ 17 декабря 2009

Попробуйте с IP-адресом. Чтобы увидеть, если это проблема DNS.

1 голос
/ 17 декабря 2009

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

Можете ли вы поэкспериментировать с заменой символических доменных имен на числовые IP-адреса перед началом работы? Или вы можете выполнить каждый запрос дважды (только для экспериментов) и посмотреть, значительно ли первый запрос медленнее второго?

Google установил DNS-сервер на (среди прочих) 8.8.8.8. Они утверждают, что это быстрее, чем большинство других DNS-серверов. Попробуйте!

1 голос
/ 17 декабря 2009

Проблема может быть в чем-то из сетевого подуровня ... Должно быть трудно найти это.

А как же setReadTimeOut() с низким значением и циклом while?

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