2011-09-17 4 views
37

¿Puede alguien explicar qué es el hilo por solicitud y el hilo por conexión? ¿En qué modelo funcionan los servlets? ¿Cómo se asignan los hilos para manejar las solicitudes HTTP? ¿Es hilo/solicitud o conexión?¿Cómo se asignan los subprocesos para manejar la solicitud del servlet?

Y digamos que si quiero realizar una tarea que consume tiempo en mis Servlet 's doGet() método de forma asíncrona, que se inicia un nuevo hilo usando ejecutores de Java para que largos cálculos se realizan en un hilo separado y la respuesta es enviada de inmediato.

Ahora, ¿eso asegura que he liberado el hilo que había estado procesando mi HttpServletRequest o todavía se está utilizando porque un hilo hijo todavía se está ejecutando?

Respuesta

42

Por solicitud significa cuando se realiza una solicitud HTTP, se crea un subproceso o se recupera desde un grupo para servirlo. Un hilo sirve toda la solicitud. El hilo por conexión sería lo mismo, excepto que el hilo se utiliza para una conexión completa, que podría ser solicitudes múltiples y también podría tener un montón de tiempo muerto entre las solicitudes. Los contenedores de servlets son hilos por pedido. Puede haber algunas implementaciones que ofrecen hilo por conexión, pero no sé, y parece que sería un desperdicio.

Crear un hilo dentro de otro hilo no establece ninguna relación especial, y el objetivo de hacerlo en la mayoría de los casos es dejar que un hilo haga más trabajo o terminar mientras el otro hilo continúa trabajando. En su escenario, usar un hilo diferente para hacer el trabajo requerido por una solicitud permitirá, como espera, permitir que la respuesta se envíe de inmediato. El hilo utilizado para atender esa solicitud también estará disponible de inmediato para otra solicitud, independientemente de cuánto tiempo tarde en completarse su otro hilo. Esto es más o menos la forma de realizar un trabajo asíncrono en un contenedor de servlet de subprocesos por solicitud.

Advertencia: Si se encuentra en un contenedor completo de Java EE, es posible que los hilos se administren de una manera que hace que sea una mala idea engendrar el suyo. En ese caso, es mejor pedirle al contenedor un hilo, pero los principios generales son los mismos.

+0

Esta no es la forma en que debe hacer el trabajo asincrónico en un contenedor, puede ser el más simple, pero no es recomendable. http://stackoverflow.com/questions/533783/why-spawning-threads-in-j2ee-container-is-discouraged/533847#533847 – Robin

+0

@Robin: Buena llamada. Añadí una advertencia sobre los contenedores completos de JEE. Normalmente pienso en términos de contenedores de servlets simples. –

+0

@Robin: Gracias chicos. No estoy manejando el ciclo de vida del hilo solo. Planeo usar Spring TaskExecutor abstraction.http: //static.springsource.org/spring/docs/2.0.x/reference/scheduling.html#scheduling-task-executor-usage Mi aplicación web funciona bajo Tomcat 6. Spring también proporcionar la implementación de administrador de trabajo como se menciona en el enlace, pero dice que no es la especificación JEE. ¿Cuál es mejor en mi entorno? – hellojava

Cuestiones relacionadas