2009-09-12 7 views
22

Sto cercando di capire dove posso configurare un timeout di richiesta per tutte le richieste che arrivano a un mio servlet (oa tutti i miei servlet)? È, come penso, una proprietà del contenitore? Inoltre, in che modo ciò influenza i diversi browser? Sono tutti conformi al parametro che il contenitore detta? O forse il timeout della richiesta non è nemmeno qualcosa che posso controllare e ogni browser decide su questo da solo? (Giusto per essere chiari, non sto parlando del timeout della sessione)Come specificare il parametro di timeout della richiesta HTTP sul contenitore di servlet Java

+1

Bella domanda. Ho letto il tuo commento all'ultima risposta e mi chiedevo quale approccio hai scelto per assicurarti che la richiesta non sia chiusa. Sto cercando di rendere me stesso Comet e non so come farlo. Potresti suggerire una soluzione? Grazie! – Dragos

+0

@Dragos Ho terminato l'implementazione di un semplice meccanismo di polling lungo che ha restituito la richiesta all'utente dopo ~ 29 secondi (che è inferiore a 30 secondi [il limite IE]). Quello che farei ora se mi trovassi di fronte allo stesso problema era provare a utilizzare l'API websockets. – Ittai

+0

Quindi stai cercando qui un timeout tale che "al momento x" scarichi la risposta corrente e uccida il thread corrente, in modo che il browser riceva dati abbastanza velocemente? I browser FWIW in questi giorni sembrano attendere "molti minuti" su una risposta ... – rogerdpack

risposta

14

Il timeout da un client (vale a dire il tempo di attesa per una risposta a una richiesta HTTP) viene determinato dal client. Per IE, vedere this, e per Firefox vedere this.

Non è possibile controllare questo timeout dal server.

+0

Prima di tutto grazie per la risposta, questo non può essere modificato programmaticamente dal lato client (tramite JavaScript) giusto? – Ittai

+0

Non ci credo, no. –

2

Non è possibile controllare il timeout del client dal server. Tuttavia potresti essere in grado di inviare dati al client ogni tanto mentre l'operazione di lunga durata è occupata. Ciò impedirà al client di scadere e può essere utilizzato per visualizzare i progressi verso l'utente, ecc. Scrivere i dati su OutputStream o Writer ottenuti dalla risposta e richiamare flush per inviare dati parziali al client.

+0

come si possono ottenere questi dati parziali se si utilizza xmlHttpRequest? Ho letto che in IE non è possibile accedere ai dati finché la richiesta non è finita – Ittai

+1

Sì, ma il client non dovrebbe scadere fino a quando alcuni dati stanno arrivando. –

+0

Hai ragione ma è un po 'più complicato perché Sto implementando Comet, quindi userò il 'Long Polling' e quindi avrò bisogno di un timeout più lungo per salvare le richieste o usare Streaming, che è quello che David stava suggerendo. Comunque grazie. – Ittai

5

Anche se non si può controllare timeout del client, si può fare di server molto impaziente :) Per esempio, su Tomcat, è possibile farlo nel vostro connettore,

<Connector port="8080" 
    ... 
    connectionTimeout ="5000" 
    disableUploadTimeout="false" /> 

Questo rende server di attendere solo 5 secondi e chiudi la connessione. Il browser riceverà un errore di connessione chiusa. Puoi trattarlo come timeout nel client.

Naturalmente, questo funziona solo se il timeout è causato dal server, non i problemi di connettività tra browser e server.

+0

"timeout" non esiste alcun parametro in Tomcat Connector – robsf

+2

Il nome parametro è connectionTimeout all'interno del tag Connector, come questo: