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
risposta
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?.
... cattiva idea, a meno che non sia necessario eseguire un lavoro intensivo a lungo termine della CPU. –
@Tomasz Nurkiewicz anche se tengo il lavoro del nuovo thread all'interno del metodo 'doPost()' di quel servlet? – saplingPro
@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? –
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.
Non vero, è necessario gestire un thread in un ambiente concorrente. –
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 –
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
forse non solo per mantenere il cliente congelato – BigMike
Così l'utente non deve aspettare per servlet per finire caricati –
http (se il thread è che richiede tempo?): //www.adam- bien.com/roller/abien/entry/are_servlets_thread_safe_and –
- 1. Perché creare un nuovo thread con startAsync anziché eseguire il lavoro nel thread servlet?
- 2. Avvio di un nuovo thread in un ciclo foreach
- 3. Utilizzare System.Threading.Tasks.Parallel creare un nuovo thread nel pool di thread?
- 4. Come si ottiene un nuovo bean di sessione stateful in un thread servlet?
- 5. Posso generare un thread da un servlet?
- 6. Avvio del servlet all'avvio dell'applicazione
- 7. Guerra di avvio Spring Boot in un contenitore servlet indipendente
- 8. Forza un nuovo thread di email
- 9. Passare un nuovo oggetto locale a un thread, thread-safe?
- 10. Nuovo thread più volte
- 11. Ottenere cookie nel servlet
- 12. Nuovo modulo su un thread diverso
- 13. Javascript Crea nuovo "Thread"
- 14. Quando un contenitore servlet interromperà il mio thread?
- 15. Esecuzione di un nuovo thread all'interno di un blocco sincronizzato
- 16. Nuovo thread per connessione client nel server socket?
- 17. Avvio di più servizi sui thread
- 18. L'utilizzo di più dispatcher servlet/contesti web con avvio primavera
- 19. PID per nuovo thread
- 20. java.lang.OutOfMemoryError: impossibile creare un nuovo thread nativo
- 21. Quando si crea e si avvia un nuovo thread .NET, viene creato un nuovo thread di livello operativo?
- 22. Come utilizzare l'iniezione di dipendenza nel servlet?
- 23. Generazione dinamica di JFreeChart nel servlet
- 24. Registrazione programmatica di un servlet nel molo 7
- 25. Come mostrare Servlet metriche Dropwizard con avvio a molla?
- 26. L'uso di async/await crea un nuovo thread?
- 27. Rails Creazione di un nuovo thread o processo in background
- 28. Creazione di un nuovo thread con metodo con il parametro
- 29. Come vengono allocati i thread per gestire la richiesta servlet?
- 30. Propagating ThreadLocal su un nuovo thread recuperato da un ExecutorService
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? –
quale app server stai usando? fornisce una sorta di supporto per le attività di lungo periodo? – BigMike
@BigMike Glassfish 3.1.1 – saplingPro