2009-02-16 15 views
5

Hoy corrigí un error en una aplicación que podría haber conducido a un ciclo sin fin en un ciclo de solicitud/respuesta de servlet.Bucle sin fin en un servlet - ¿es posible la recuperación?

Por curiosidad: ¿Qué ocurre si mi servlet queda atrapado en un bucle for (;;)?

¿Es de alguna manera posible recuperar? ¿Tomcat detectará esto? ¿Se puede matar a esta instancia sin reiniciar el servidor?

¿O es esta una de las peores cosas que pueden suceder y una forma muy rápida de matar a un contenedor web?

EDITAR: Era una verdadera CPU interminable que consumía bucles todo el tiempo, pero no la memoria. Lo mantuve funcionando por unos minutos. Creo que puedo confirmar que Tomcat no detectará este tipo de cosas :-)

Respuesta

1

No creo que Tomcat detecte un ciclo infinito. Es posible que pueda detener el servlet utilizando el administrador Tomcat, si el servlet no está consumiendo todo el tiempo de CPU con su ciclo. De lo contrario, probablemente sea más seguro y fácil reiniciar el servidor.

Esto es por qué haces extensas pruebas localmente antes de desplegar sus aplicaciones ;-) y tener mucho cuidado de que todos los bucles tienen condiciones de salida ...

+0

Digamos que este error se detectó antes de que causara problemas de producción ;-) –

+0

¡bueno! Y ciertamente no quise sonar condescendiente, estoy seguro de que sabes la importancia de las pruebas. –

+0

No te preocupes, no lo hiciste –

1

No estoy seguro si Tomcat tiene dicha detección, pero el contenedor web de Websphere sí lo hace. Sin embargo, obviamente toma el contenedor un tiempo relativamente largo para detectar un hilo "colgado". Servidor bajo una carga puede ser matado fácil y rápidamente por dicho código.

+0

Hola, es bueno saber que esa websphere detecta algo como esto. Gracias por la información –

1

si el bucle sin fin es causada por una redirección sin fin, que lo hará tarde o temprano terminará esa solicitud con StackOverflowException.

es un bucle infinito "verdadero", puede enganchar una CPU/núcleo de forma permanente y finalmente bloquear toda la aplicación con OutOfMemoryException.

tomcat tiene, por lo que yo sé, no hay detección explícita de estos problemas.

0

Me imagino que se podía manejar esto con un ajuste de tiempo de espera apropiado:

http://tomcat.apache.org/connectors-doc/generic_howto/timeouts.html

+0

Hm ... ¿Estás seguro? Leí el documento que vinculó y no veo cómo esos temporizadores podrían detectar un hilo "colgado" (básicamente bloqueado en vivo). ¡Por favor corrígeme si estoy equivocado! –

+0

Los tiempos de espera conectados a duffymo son para el conector JK, que conecta Tomcat con Apache. Entonces, no, probablemente no ayudarán. –

Cuestiones relacionadas