2015-09-08 16 views
8

Sto cercando di scaricare un file su connessione molto lenta in questo modo:HttpURLConnection getInputStream: timeout sempre dopo 180 secondi

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."); 

e ho notato che per alcuni motivi (nativo timeout socket di Windows?) Sempre interruzioni dopo secondi di download senza eccezioni.

Il timeout impostato in setConnectTimeout (...) o setReadTimeout (...) non è di aiuto.

Ho provato a scaricare il file utilizzando 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 

completa di file è stato salvato con successo su disco dopo 20 minuti.

Cosa c'è di sbagliato in HttpURLConnection?

Modifica: Ho provato a scaricare il file di test da un altro server tramite il protocollo http e tutto era OK. Sembra essere un problema specifico del server o del protocollo. Ma perché wget riesce a scaricare l'intero file?

Edit2: seguendo i vostri consigli ho anche provato:

  • rimuovere connection.setDoOutput (true);
  • uso Link diretto per evitare il reindirizzamento 302
  • sostituire metodo Files.copy da un'implementazione personalizzata

Purtroppo nessuno di sopra aiuta.

Edit3: Ho notato che il file è disponibile anche sullo stesso server tramite protocollo HTTP non sicuro. Così ho cambiato solo l'URL nel mio codice e dopo secondi ho ottenuto:

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) 
+0

La mia comprensione di readTimeout è la quantità di tempo di attesa prima che i dati siano disponibili. Ad ogni modo, sono in milli secondi e tu hai dato 240.000 - 4 minuti. – KDM

+0

Ho provato a ridurre entrambi i timeout a 10 secondi oa salire a 10 m ma si interrompe sempre dopo 180 secondi. –

+0

Potresti postare lo stacktrace completo dell'eccezione osservata? –

risposta

2

Ho finalmente trovato una soluzione qui It is not possible to download large files at Jetty server (grazie ancora StackOverflow). Il problema era sul lato server.

Jetty 9.2 che abbiamo utilizzato ha un bug che interrompe la pubblicazione di file di grandi dimensioni su connessioni lente (https://bugs.eclipse.org/bugs/show_bug.cgi?id=472621). Sembra che l'eccezione non sia sempre generata.

Wget e browser in qualche modo sono stati in grado di completare il download nonostante il trasferimento o il ripristino della connessione in stallo.Sfortunatamente la mia applicazione Java era più sensibile ...

Aggiornamento di Jetty in bundle all'ultima versione stabile 9.3.3 risolti tutti i problemi con i download.

0
connection.setRequestMethod("GET"); 

Qui avete intenzione di fare un HTTP GET.

connection.setDoOutput(true); 

Qui lo si cambia in PUT.

Files.copy(connection.getInputStream(), new File("test.zip").toPath()); 

Qui si sta ricevendo il flusso di input senza aver mai scritto nulla. Il server sta ancora aspettando i dati POST che non invii mai, quindi non invierà mai una risposta, quindi stai scadendo.

Perdere la linea setDoOutput(true);.

+0

Grazie per la risposta, ma non ha aiutato. –

+0

Dovrai mostrare cosa hai fatto. Modificalo nella tua domanda. – EJP

Problemi correlati