2011-09-17 4 views
37

Qualcuno può spiegare cosa è thread per richiesta e thread per connessione? Su quale modello funzionano le servlet? Come vengono allocati i thread per gestire le richieste HTTP? È thread/richiesta o connessione?Come vengono allocati i thread per gestire la richiesta servlet?

E diciamo se voglio eseguire un compito che richiede tempo in S' doGet() metodo in modo asincrono, mi metto un nuovo thread utilizzando esecutori Java in modo da lunghi calcoli sono fatti in un thread separato e la risposta viene inviata subito i miei Servlet.

Ora mi assicuro che ho liberato il thread che stava elaborando il mio HttpServletRequest o è ancora in uso perché un thread figlio è ancora in esecuzione?

risposta

42

Per richiesta indica quando viene effettuata una richiesta HTTP, un thread viene creato o recuperato da un pool per servirlo. Un thread serve l'intera richiesta. Thread per connessione sarebbe la stessa cosa, tranne il thread è utilizzato per un'intera connessione, che potrebbe essere più richieste e potrebbe anche avere un sacco di tempo morto tra le richieste. I contenitori servlet sono thread per richiesta. Potrebbero esserci alcune implementazioni che offrono thread per connessione, ma non lo so, e sembra che sarebbe molto dispendioso.

La creazione di un thread all'interno di un altro thread non stabilisce alcuna relazione speciale e l'intero punto in cui farlo nella maggior parte dei casi consiste nel lasciare che un thread funzioni di più o termini mentre l'altro thread continua a funzionare. Nello scenario, l'utilizzo di una thread diversa per eseguire il lavoro richiesto da una richiesta consentirà, come previsto, di inviare immediatamente la risposta. Anche il thread utilizzato per servire quella richiesta sarà immediatamente disponibile per un'altra richiesta, indipendentemente da quanto tempo ci vorrà per completare l'altro thread. Questo è praticamente il il modo di eseguire il lavoro asincrono in un contenitore di servlet thread-per-request.

Avvertenza: Se si è in un contenitore Java EE completo, i thread possono essere gestiti in modo tale da rendere una cattiva idea generare il proprio. In tal caso, è meglio chiedere al contenitore una discussione, ma i principi generali sono gli stessi.

+0

Questo non è il modo in cui si dovrebbe eseguire il lavoro asincrono in un contenitore, potrebbe essere il più semplice ma non è consigliabile. http://stackoverflow.com/questions/533783/why-spawning-threads-in-j2ee-container-is-discouraged/533847#533847 – Robin

+0

@Robin: buona chiamata. Ho aggiunto un avvertimento sui contenitori JEE pieni. Di solito penso in termini di semplici contenitori servlet. –

+0

@Robin: Grazie ragazzi. Non sto gestendo il ciclo di vita del filo da solo. Ho intenzione di usare Spring TaskExecutor abstraction.http: //static.springsource.org/spring/docs/2.0.x/reference/scheduling.html#scheduling-task-executor-usage La mia app web funziona sotto tomcat 6. Spring anche fornire l'implementazione del workmanager come menzionato nel link ma dice la sua specifica non JEE. Quale è meglio nel mio ambiente? – hellojava