java - log - Tiempo de espera de solicitud de Tomcat
log de errores tomcat (6)
En mi aplicación web hay algunas solicitudes que duran más de 20 segundos. Pero en algunas situaciones el código puede conducir a un bucle infinito o algo similar que ralentiza el servidor.
Quiero poner un tiempo de espera de solicitud durante 60 segundos en el lado del servidor. ¿Esto se implementa en Tomcat?
Gracias, Horatiu
Añadir tomcat en Eclipse
En Eclipse, como servidor tomcat, haga doble clic en "Servidor Tomcat v7.0 en Localhost", cambie las propiedades como se muestra en la configuración de tiempo de espera 45 a cualquier segundo que desee
Con Tomcat 7, puede agregar StuckThreadDetectionValve que le permitirá identificar los hilos que están "atascados". Puede configurar la válvula en el elemento Contexto de las aplicaciones donde desea hacer la detección:
<Context ...>
...
<Valve
className="org.apache.catalina.valves.StuckThreadDetectionValve"
threshold="60" />
...
</Context>
Esto escribiría una entrada WARN en el registro de Tomcat para cualquier hilo que lleve más de 60 segundos, lo que le permitiría identificar las aplicaciones y prohibirlas porque son defectuosas.
Basado en el código fuente , puede escribir su propia válvula que intente detener el hilo, sin embargo, esto tendría efectos en el grupo de subprocesos y no hay manera confiable de detener un hilo en Java sin la cooperación de ese hilo ...
Este artículo habla de establecer los tiempos de espera en el nivel del servidor. http://www.coderanch.com/t/364207/Servlets/java/Servlet-Timeout-two-ways
¿Qué está causando que la aplicación entre en un ciclo infinito? Si está abriendo conexiones a otros recursos, es posible que desee poner tiempos de espera en esas conexiones y enviar una respuesta adecuada cuando se agote el tiempo de espera.
Para cualquiera que no le guste ninguna de las soluciones publicadas arriba como yo, simplemente puede implementar un temporizador usted mismo y detener la ejecución de la solicitud lanzando una excepción en tiempo de ejecución. Algo como a continuación:
try
{
timer.schedule(new TimerTask() {
@Override
public void run() {
timer.cancel();
}
}, /* specify time of the requst */ 1000);
}
catch(Exception e)
{
throw new RuntimeException("the request is taking longer than usual");
}
o preferiblemente use el timeLimiter de guayaba de Java here
Puede establecer el tiempo de espera predeterminado en server.xml
<Connector URIEncoding="UTF-8"
acceptCount="100"
connectionTimeout="20000"
disableUploadTimeout="true"
enableLookups="false"
maxHttpHeaderSize="8192"
maxSpareThreads="75"
maxThreads="150"
minSpareThreads="25"
port="7777"
redirectPort="8443"/>
Si intenta evitar que una solicitud se ejecute durante demasiado tiempo, establecer un tiempo de espera en Tomcat no lo ayudará. Como dice Chris, puede establecer el valor de tiempo de espera global para Tomcat. Pero, desde el Apache Tomcat Connector - Tiempo de espera genérico de HowTo , vea la sección Tiempo de espera de respuesta:
JK también puede usar un tiempo de espera en las respuestas de solicitud. Este tiempo de espera no mide el tiempo de procesamiento completo de la respuesta. En cambio, controla cuánto tiempo se permite entre los paquetes de respuesta consecutivos.
En la mayoría de los casos, esto es lo que uno realmente quiere. Considere, por ejemplo, descargas de larga ejecución. No podría establecer un tiempo de respuesta global efectivo, porque las descargas pueden durar muchos minutos. Sin embargo, la mayoría de las aplicaciones tienen un tiempo de procesamiento limitado antes de comenzar a devolver la respuesta. Para esas aplicaciones, puede establecer un tiempo de respuesta explicita. Las aplicaciones que no armonizan con los tiempos de espera de respuesta son aplicaciones de tipo por lotes, almacén de datos y aplicaciones de generación de informes que se espera que observen largos tiempos de procesamiento.
Si JK cancela la espera de una respuesta, porque se ha agotado el tiempo de respuesta, no hay forma de detener el procesamiento en el back-end. Aunque libera recursos de procesamiento en su servidor web, la solicitud continuará ejecutándose en el back-end, sin ninguna forma de devolver un resultado una vez que se agotó el tiempo de espera de respuesta.
Entonces Tomcat detectará que el servlet no ha respondido dentro del tiempo de espera y enviará una respuesta al usuario, pero no detendrá la ejecución del subproceso . No creo que puedas lograr lo que quieres hacer.