2012-04-26 19 views
5

Quando una richiesta raggiunge un servlet che gestisce il caricamento di file, è una buona idea iniziare un nuovo thread in quel servlet usando new Thread(r).start() che gestirà un altro pezzo di dati fornito con il file che era caricato. Volevo questo per gestire entrambi i lavori parallelamente.avvio di un nuovo thread nel servlet

+0

Sconsiglioi contro di esso, a meno che non si usi il raggruppamento dei thread. In alternativa, Servlet 3 ora ha una chiamata di servizio asincrona, perché non esplorarla? –

+0

quale app server stai usando? fornisce una sorta di supporto per le attività di lungo periodo? – BigMike

+0

@BigMike Glassfish 3.1.1 – saplingPro

risposta

17

Non è solo una cattiva idea, ma non funzionerà. Ecco perché: la tua richiesta di caricamento del file colpirà alla fine il metodo doPost(). Finché sei in questo metodo, il contenitore mantiene aperta la connessione. Una volta che si ritorna da quel metodo (e se si decide di gestire i dati in arrivo in un thread separato, doPost() terminerà in anticipo) il contenitore presume che la richiesta sia terminata e chiuderà la connessione. Dal punto di vista del cliente, il caricamento è stato interrotto dal server. E a causa della natura asincrona dei fili, l'interruzione avverrà in un momento casuale.

Credetemi, alcuni utenti già sperimentato che: HttpServletResponse seems to periodically send prematurely.

inoltre è una cattiva idea per iniziare nuovo thread per ogni richiesta in quanto questo scale male (ed è anche vietato da alcune specifiche). Quello che è può utilizzare la richiesta asincrona Servlet 3.0 e gestire i caricamenti in modo asincrono, ma preferibilmente utilizzando un pool di thread. Vedi anche: Why create new thread with startAsync instead of doing work in servlet thread?.

+0

... cattiva idea, a meno che non sia necessario eseguire un lavoro intensivo a lungo termine della CPU. –

+0

@Tomasz Nurkiewicz anche se tengo il lavoro del nuovo thread all'interno del metodo 'doPost()' di quel servlet? – saplingPro

+0

@Tomasz Nurkiewicz sarà giusto inviare una nuova richiesta ad un altro servlet dal metodo run del thread, all'interno del metodo post di questo servlet? –

-5

Non c'è niente di sbagliato nell'iniziare una nuova discussione in Servlet (a differenza dell'EJB), quindi sì, va bene.

EDIT: secondo pensiero @Tomasz Nurkiewicz ha ragione. Il caricamento del file verrà interrotto.

+0

Non vero, è necessario gestire un thread in un ambiente concorrente. –

+0

Fintantoché il thread non sta usando alcuna variabile non locale (campi nel servlet) non ci sono problemi. Suppongo tutto avviene all'interno doGet metodo/doPost –

-2

servlet sono implicitamente eseguiti in discussioni di server web, quindi, quando qualsiasi richiesta raggiunge un servlet, verrà eseguito in un thread diverso. Non prevedo un motivo per creare un filo fresco da soli

+0

forse non solo per mantenere il cliente congelato – BigMike

+0

Così l'utente non deve aspettare per servlet per finire caricati –

+0

http (se il thread è che richiede tempo?): //www.adam- bien.com/roller/abien/entry/are_servlets_thread_safe_and –

Problemi correlati