2011-10-27 9 views
6

Estoy escribiendo un servlet, que se ejecuta en el contenedor de servlets de Java (por ejemplo, JBoss, Jetty, Tomcat, GlassFish).¿Cuándo un contenedor de servlet interrumpe mi hilo?

¿Cuáles son las razones por las que un contenedor de servlets interrumpe el hilo que ejecuta mi controlador de solicitudes HTTP? ¿Lo hará solo cuando se apaga? ¿Hará eso cuando el cliente no responda?

¿Está estandarizado, o hay algún contenedor libre para hacer lo que él desea?

Para aclarar, no estoy hablando de interrumpir los hilos nuevos que creo, solo en los hilos del contenedor de servlets en los que se ejecutan mis solicitudes. (Aunque será interesante si mencionas qué sucede con los nuevos hilos en la respuesta).

+1

Para evitar ambigüedades, cuando dijiste "hilo", ¿realmente * significa * "solicitud HTTP"? – BalusC

+0

Bueno, técnicamente interrumpirá mi hilo, y sucederá cuando el hilo se ejecute mi solicitud HTTP. Entonces no estoy seguro de cómo escribirlo. Reformulado eso, espero que sea mejor. –

+0

Los escenarios son muy diferentes si genera hilos por su cuenta. Entonces, debes tener más claro qué hilo exactamente quieres decir y cómo ha sido creado y si es un hilo daemon o no, etcétera. – BalusC

Respuesta

1

¿Cuáles son las razones por las que un contenedor de servlets interrumpe el hilo que ejecuta mi controlador de solicitudes HTTP?

Eso depende del contenedor en sí. De hecho, no está estandarizado en la especificación de servlet.

¿Lo hará solo cuando se apaga?

Parece una de las razones más obvias. Las pruebas locales me enseñaron que al menos Tomcat 7.0.22 y Glassfish 3.1.1 abortarán todo el procesamiento del servlet inmediatamente sin permitirles continuar su tarea. No se lanzarán excepciones en ese punto.

¿Lo hará cuando el cliente no responda?

Solo cuando los encabezados de solicitud no se han recibido por completo. Hay un tiempo de espera específico del contenedor en la conexión del socket que generalmente es de 60 segundos. Pero si los encabezados de solicitud no se han recibido por completo, entonces su método de servlet no se ingresará de todos modos. Solo si los encabezados de solicitud están completamente llenos, entonces se ingresará su método de servlet.

Luego, dentro del método de servlet; si el cliente ha suministrado un cuerpo de solicitud (por ejemplo, POST) y el código de su servlet comienza a leer el cuerpo de solicitud por ejemplo request.getParameter() o request.getInputStream(), arrojará IOException cuando el cliente haya cancelado el envío del cuerpo de la solicitud en ese momento. Por otro lado, cuando escribe en la respuesta (y la vacía/confirma), también se lanzará un IOException cuando el cliente anule la conexión en ese punto. Si es necesario, puede ponerlo en un try-catch, pero no puede hacer nada más que simplemente iniciar sesión. La utilidad de esos registros es muy cuestionable y probablemente solo desordene los registros de su servidor.

+0

Entonces, básicamente, puedo ignorar 'InterruptedException' en el código de servlet, como nunca debería ocurrir? –

+0

Sí. Aún más, solo puede atraparlo si está creando y administrando los hilos * usted mismo *. – BalusC

+0

Puedo verlo, por ejemplo, con 'process.waitFor()' que lo arroja. –

Cuestiones relacionadas