2008-09-05 13 views
7

Tengo un filtro Tomcat que delega las solicitudes al objeto de manejo dependiendo de la URL. Este es el único filtro en el FilterChain. Tengo una aplicación Ajax que martilla este filtro con muchas solicitudes.Tomcat doFilter() invocado con respuesta comprometida

Recientemente noté un problema donde el método del filtro doFilter a menudo se llama con una respuesta comprometida como parámetro (Internamente, es la respuesta del coyote que está marcada como comprometida).

Me parece que la única forma en que esto puede suceder es si no se llama al método recycle() en esta respuesta de coyote. Lo he verificado para asegurarme de que no guardo referencias a ninguno de los objetos de solicitud, respuesta, outputStream o escritor. Además, me aseguré de cerrar el outputStream en un bloque finally. Sin embargo, esto no resuelve este problema.

Parece que estoy haciendo algo para abusar del contenedor de servlets pero estoy teniendo problemas para rastrearlo.

Respuesta

3

He intentado utilizar Tomcat 6.16 y 6.18. Este es definitivamente el único filtro en la cadena.

Parece que algo está manteniendo una referencia al servlet outputStream. Envolví el ServletOutputStream en mi propio OutputStream y luego me aseguré de que la referencia se destruyera. Esto solucionó el problema, por lo que ya no veo una respuesta comprometida.

Este es un extraño efecto secundario de mantener una referencia. Pero no creo que califique como un error de Tomcat. Lo más probable es que haya un error en ImageIO.createImageOutputStream() que sospecho que contiene la referencia.

+0

teníamos que hacer exactamente lo mismo. Envuelva el flujo de salida y evite que cometa la respuesta hasta que estemos listos. – ScArcher2

0

¿Qué versión de Tomcat estás utilizando? Para mí esto suena como un error en Tomcat, no puedo pensar en ninguna razón por la que tu método doFilter deba invocarse con una respuesta que ya se haya confirmado (si ese filtro es el único en la cadena, ¿estás seguro de esto?)

Cuestiones relacionadas