Cuando una solicitud llega a un servlet que maneja la carga de archivos, es una buena idea comenzar un nuevo hilo en ese servlet usando new Thread(r).start()
que manejará otro dato que venga con el archivo que fue cargado Quería esto para manejar ambos trabajos paralelamente.iniciando un nuevo hilo en el servlet
Respuesta
No solo es una mala idea, sino que tampoco funcionará. Esta es la razón: su solicitud de carga de archivos finalmente llegará al método doPost()
. Mientras esté en este método, el contenedor mantiene la conexión abierta. Una vez que regrese de ese método (y si decide manejar los datos entrantes en un hilo separado, doPost()
terminará temprano) el contenedor supone que ha terminado con la solicitud y cerrará la conexión. Desde la perspectiva del cliente, la carga fue interrumpida por el servidor. Y debido a la naturaleza asíncrona de los hilos, la interrupción ocurrirá en un momento aleatorio.
Créanme, algunos usuarios ya han experimentado eso: HttpServletResponse seems to periodically send prematurely.
Además, es una mala idea iniciar un nuevo subproceso por solicitud, ya que escalas mal (e incluso está prohibido por algunas especificaciones). Lo que puede hacer es usar la solicitud asíncrona de Servlet 3.0 y manejar las cargas de forma asíncrona, pero preferiblemente utilizando algún conjunto de subprocesos. Vea también: Why create new thread with startAsync instead of doing work in servlet thread?.
... mala idea a menos que necesite hacer alguna tarea de larga duración que requiera mucha CPU. –
@Tomasz Nurkiewicz, incluso si mantengo el trabajo del nuevo subproceso dentro del método 'doPost()' de ese servlet? – saplingPro
@Tomasz Nurkiewicz ¿estará bien enviar una nueva solicitud a otro servlet desde el método de ejecución del subproceso, dentro del método de publicación de este servlet? –
No hay nada de malo en comenzar un nuevo hilo en Servlet (a diferencia de EJB), así que sí, está bien.
EDIT: segundo pensamiento @Tomasz Nurkiewicz tiene razón. La carga del archivo se detendrá.
No es cierto, se debe gestionar la escritura de un hilo en un entorno concurrente. –
Siempre que thread no use variables no locales (campos en servlet) no hay problema. Supongo que todo sucede dentro del método doGet/doPost –
Los servlets se ejecutan implícitamente en nuevos subprocesos mediante un servidor web, por lo que cada vez que una solicitud llegue a un servlet, se ejecutará en un subproceso diferente. no preveo una razón para crear un hilo nuevo usted mismo
tal vez solo para no congelar el cliente (si el hilo lleva mucho tiempo) – BigMike
Entonces el usuario no tiene que esperar que el servlet termine de cargar –
http: //www.adam- bien.com/roller/abien/entry/are_servlets_thread_safe_and –
- 1. ¿Iniciando un hilo detenido?
- 2. Iniciando un hilo que duerme en .NET
- 3. ¿Por qué crear un nuevo hilo con startAsync en lugar de trabajar en el hilo de servlet?
- 4. Iniciando un hilo para cada bucle interno en OpenMP
- 5. ¿Puedo generar un hilo de un servlet?
- 6. Iniciando un nuevo shell bash desde un shell bash
- 7. Nuevo formulario en un hilo diferente
- 8. WebBrowser Control en un nuevo hilo
- 9. Cómo iniciar el servicio en un nuevo hilo en Android
- 10. Javascript Crear Nuevo "Hilo"
- 11. nuevo hilo() y Colección
- 12. nuevo Runnable() pero no hay un nuevo hilo?
- 13. PID para nuevo hilo
- 14. Forzar un nuevo hilo de correo electrónico
- 15. ¿Handler.post (ejecutable) inicia un nuevo hilo?
- 16. ¿Cuándo eliminará ASP.NET un nuevo hilo?
- 17. cuanto a la seguridad del hilo servlet
- 18. C# Llamar a un método en un nuevo hilo
- 19. ¿Cómo iniciar un nuevo hilo en un servicio?
- 20. Inicio de un nuevo hilo en un bucle foreach
- 21. ¿Cuándo un contenedor de servlet interrumpe mi hilo?
- 22. Iniciando un servidor node.js
- 23. ¿Cómo abro una ventana en un nuevo hilo?
- 24. ¿Iniciando un proceso en Java?
- 25. Java hace que javax.swing.Timer se ejecute en un nuevo hilo?
- 26. ¿Se inician los BroadcastReceivers de Android en un nuevo hilo?
- 27. Iniciando AVAssetExportSession en el Fondo
- 28. threadlocal variables en un servlet
- 29. Iniciando el paquete OSGi
- 30. engendrar un nuevo hilo para abrir una nueva ventana y cerrarlo desde un hilo diferente
No me gustaría desaprobarlo, a menos que utilice la agrupación de subprocesos. Alternativamente, Servlet 3 ahora tiene una llamada de servicio asíncrona, ¿por qué no explorar eso? –
qué servidor de aplicaciones estás usando? ¿proporciona algún tipo de soporte para tareas de larga duración? – BigMike
@BigMike Glassfish 3.1.1 – saplingPro