2012-09-13 29 views
10

Sto cercando di effettuare una chiamata a un processo molto pesante. La durata media del lavoro è stimata in 9-10 minuti.Java: timeout timeout socket socket

Quando sto l'esecuzione del processo, ho impostato il timeout per un numero ridicolmente enorme: 99999999.

Dopo 2 minuti, ottengo il seguente errore:

java.net.SocketTimeoutException: Read timed out

ho cercato di pasticciare con ancora un po ', e ho impostato il timeout a 3000, e dopo 3 secondi come anticipato ho ottenuto lo stesso errore.

Avete qualche idea sul motivo per cui socket.setSoTimeout(99999999) lo imposta su 120000 max?

+3

Questo metodo passa al sistema operativo in modo che il comportamento di questo metodo dipenda dal tuo sistema operativo. Quale versione del sistema operativo stai usando? –

+1

Hai provato a inviare messaggi keep-alive o hai "richiamato" il processo una volta completato, invece di tenere aperto un socket per anni? – Thor84no

+1

Sembra che il sistema operativo rifiuti semplicemente il tuo valore perché se è fuori portata. Vorrei provare a giocare con valori più alti ma non così alti (lo stai impostando su più di 27 ore). ad esempio 3 minuti, 5 minuti, 10 minuti. – SJuan76

risposta

2

Ho avuto lo stesso problema e la soluzione non è stata utilizzata socket.shutdownInput(); socket.shutDownOutput(); fino all'ultima ora di lettura o scrittura dei dati sul socket. Ciò ha reso lo zoccolo andare nello stato di FIN_WAIT, aspettando così 2 minuti prima della chiusura. Puoi leggere ulteriori informazioni a riguardo in this post

+0

Questa tecnica non può risolvere un'eccezione di timeout di lettura. – EJP

+0

Se hai avuto il tempo di eseguire il mio test case avresti visto che questa è la soluzione. e puoi provare tu stesso, scrivere alcuni input su un socket e usare 'shutdownInput' e vedrai che il socket cambierà in stato FIN_WAIT. attendi 2 minuti e vedrai che la presa è chiusa. – Rotem

+1

Grazie, Rotem, ha funzionato! :) – Urbanleg

1

Non sono sicuro di come funziona l'applicazione, ma cerco di impostare un infinito timeout to the socket

public void setSoTimeout(int timeout) 
       throws SocketException 

Enable/disable SO_TIMEOUT with the specified timeout, in milliseconds. With this option set to a non-zero timeout, a read() call on the InputStream associated with this Socket will block for only this amount of time. If the timeout expires, a java.net.SocketTimeoutException is raised, though the Socket is still valid. The option must be enabled prior to entering the blocking operation to have effect. The timeout must be > 0 . A timeout of zero is interpreted as an infinite timeout.

Se si forniscono ulteriori informazioni sulla chiamata, io possa migliorare la risposta.

+0

Ho provato a impostare il timeout su 0. (che si suppone essere infinito) ma ancora, dopo 120 secondi, genera un'eccezione. – Urbanleg

+0

Mentre sei connesso, il buffer legge tutti i dati? Voglio dire, è il server che risponde alla tua connessione ?, perché c'è la possibilità che l'indirizzo del server non sia risolto correttamente nella tua rete, non so se è locale, o un VPN, o solo un server remoto, non lo so So che se l'indirizzo viene risolto utilizzando una query netbios, o il file host o un dns remoto, ci sono molti elementi che possono portare all'indirizzo sbagliato –

+0

il server è locale, quando sto impostando il processo pesante per prendere meno di 2 minuti funziona bene. – Urbanleg

2

Chiaramente non stai impostando il timeout che pensi di impostare, o qualcun altro lo sta cambiando in seguito. Dovrai postare del codice per ottenere ulteriori chiarimenti.

Nota che secondo W.R. Stevens in TCP/IP Illustrated, Vol II, # 17.4, il timeout si svolge in un breve come un certo numero di 1000Hz zecche, quindi un timeout oltre 11 minuti non è possibile. Questo vale per il codice BSD.

+0

@downvoter Per favore, spiega. Non sei d'accordo con Stevens? – EJP