2012-04-26 23 views
5

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

+0

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? –

+0

qué servidor de aplicaciones estás usando? ¿proporciona algún tipo de soporte para tareas de larga duración? – BigMike

+0

@BigMike Glassfish 3.1.1 – saplingPro

Respuesta

17

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?.

+0

... mala idea a menos que necesite hacer alguna tarea de larga duración que requiera mucha CPU. –

+0

@Tomasz Nurkiewicz, incluso si mantengo el trabajo del nuevo subproceso dentro del método 'doPost()' de ese servlet? – saplingPro

+0

@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? –

-5

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á.

+0

No es cierto, se debe gestionar la escritura de un hilo en un entorno concurrente. –

+0

Siempre que thread no use variables no locales (campos en servlet) no hay problema. Supongo que todo sucede dentro del método doGet/doPost –

-2

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

+0

tal vez solo para no congelar el cliente (si el hilo lleva mucho tiempo) – BigMike

+0

Entonces el usuario no tiene que esperar que el servlet termine de cargar –

+0

http: //www.adam- bien.com/roller/abien/entry/are_servlets_thread_safe_and –