HttpURLConnection getInputStream: изчакване винаги след 180 секунди

Опитвам се да изтегля файл при много бавна връзка по следния начин:

    java.net.URL url = new URL("https://X.X.X.X:8443/path/2f6b88cf2b70ee933197edfc9627a9bc/");
    HttpURLConnection connection = (HttpURLConnection)  url.openConnection();
    connection.setRequestMethod("GET");
    connection.setDoOutput(true);
    connection.setConnectTimeout(240 * 1000);
    connection.setReadTimeout(240 * 1000);
    long start = System.currentTimeMillis();
    Files.copy(connection.getInputStream(), new File("test.zip").toPath());
    System.out.println("Time: "+((System.currentTimeMillis() - start) / 1000) + " sec.");

и забелязах, че по някакви причини (изчакване на изчакване на сокет на Windows?) винаги се прекъсва след 180 секунди изтегляне без никакви изключения.

Времето за изчакване, зададено в setConnectTimeout(...) или setReadTimeout(...) не помага.

Опитах се да изтегля този файл с помощта на wget:

wget https://X.X.X.X:8443/path/2f6b88cf2b70ee933197edfc9627a9bc/ --no-check-certificate
--2015-09-07 14:36:12--  https://X.X.X.X:8443/path/2f6b88cf2b70ee933197edfc9627a9bc/
Connecting to X.X.X.X:8443... connected.
WARNING: The certificate of ‘X.X.X.X’ is not trusted.
WARNING: The certificate of ‘X.X.X.X’ hasn't got a known issuer.
The certificate's owner does not match hostname ‘X.X.X.X’
HTTP request sent, awaiting response... 302 Found
Location: https://X.X.X.X:8443/files/test.zip [following]
--2015-09-07 14:36:16--  https://X.X.X.X:8443/files/test.zip
Reusing existing connection to X.X.X.X:8443.
HTTP request sent, awaiting response... 200 OK
Length: 321917584 (307M) [application/zip]
Saving to: ‘test.zip’

test.zip                                  100%[====================================================================================>] 307.00M   253KB/s   in 19m 50ss

Целият файл беше успешно записан на диска след 20 минути.

Какво не е наред с HttpURLConnection?

Редактиране: Опитах се да изтегля тестов файл от друг сървър чрез http протокол и всичко беше наред. Изглежда, че проблемът е специфичен за сървър или протокол. Но защо wget успява да изтегли целия файл?

Edit2: следвайки вашите съвети, аз също опитах:

  • премахнете връзката.setDoOutput(true);
  • използвайте директна връзка, за да избегнете пренасочване 302
  • заменете метода Files.copy с персонализирана реализация

За съжаление нищо от горното не помага.

Edit3: Забелязах, че файлът също е достъпен на същия сървър чрез несигурен http протокол. Така че промених само URL адреса в моя код и след 120 секунди получих:

Exception in thread "main" java.net.SocketException: Connection reset
    at java.net.SocketInputStream.read(SocketInputStream.java:196)
    at java.net.SocketInputStream.read(SocketInputStream.java:122)
    at java.io.BufferedInputStream.read1(BufferedInputStream.java:273)
    at java.io.BufferedInputStream.read(BufferedInputStream.java:334)
    at sun.net.www.MeteredStream.read(MeteredStream.java:134)
    at java.io.FilterInputStream.read(FilterInputStream.java:133)
    at sun.net.www.protocol.http.HttpURLConnection$HttpInputStream.read(HttpURLConnection.java:3066)
    at sun.net.www.protocol.http.HttpURLConnection$HttpInputStream.read(HttpURLConnection.java:3060)
    at java.nio.file.Files.copy(Files.java:2735)
    at java.nio.file.Files.copy(Files.java:2854) 

person Tomasz Ceszke    schedule 08.09.2015    source източник
comment
Моето разбиране за readTimeout е, че времето за изчакване, докато данните са налични. Както и да е, те са в милисекунди, а вие сте дали 240 000 - 4 минути.   -  person Dakshinamurthy Karra    schedule 08.09.2015
comment
Опитах да намаля и двата изчаквания до 10s или да увелича до 10m, но винаги прекъсва след 180s.   -  person Tomasz Ceszke    schedule 08.09.2015
comment
Бихте ли публикували пълната стекова трасировка на наблюдаваното изключение?   -  person Little Santi    schedule 08.09.2015
comment
@LittleSanti Трябва да спомена, че няма изключение. Програмата излиза нормално.   -  person Tomasz Ceszke    schedule 08.09.2015
comment
@tomek.ceszke От изхода на wget - има пренасочване 302. Вместо да използвате текущия URL адрес, можете ли да опитате с пренасочения URL адрес и да видите какво ще се случи?   -  person Dakshinamurthy Karra    schedule 08.09.2015
comment
@KDM Току-що проверих, не помогна. HttpURLConnections следва пренасочванията правилно.   -  person Tomasz Ceszke    schedule 08.09.2015
comment
@tomek.ceszke Ако няма изрична грешка, какво е евентуалното съдържание на файл test.zip?   -  person Little Santi    schedule 08.09.2015
comment
@tomek.ceszke Този код, който опитвате, част от по-голяма програма ли е или самостоятелна? Files.copy връща броя на копираните байтове. Можете ли да отпечатате тази стойност?   -  person Dakshinamurthy Karra    schedule 08.09.2015
comment
@KDM Copied 209747968 bytes in 180 sec Оригиналният размер е 307 MB   -  person Tomasz Ceszke    schedule 08.09.2015


Отговори (2)


Най-накрая намерих решение тук Не е възможно за изтегляне на големи файлове на Jetty server (благодаря отново StackOverflow). Проблемът беше от страната на сървъра.

Jetty 9.2, който използвахме, има грешка, която прекъсва обслужването на големи файлове при бавни връзки (https://bugs.eclipse.org/bugs/show_bug.cgi?id=472621). Изглежда, че изключение не винаги се прави.

Wget и браузърите по някакъв начин успяха да завършат изтеглянето въпреки закъсалото прехвърляне или нулиране на връзката. За съжаление моето Java приложение беше по-чувствително...

Надграждане на пакета Jetty до последната стабилна версия 9.3.3 коригира всички проблеми с изтеглянията.

person Tomasz Ceszke    schedule 11.09.2015

Да, вероятно сте прав, но когато публикувах отговора си, потребителят не беше публикувал своите 3 редакции. Досега не съм сигурен какво има предвид.
person user207421    schedule 08.09.2015
comment
Благодаря за отговора, но не помогна. - person Tomasz Ceszke; 08.09.2015
comment
Ще трябва да покажете какво сте направили. Редактирайте го във вашия въпрос. - person user207421; 08.09.2015