2009-09-12 9 views
22

Estoy tratando de entender dónde puedo configurar un tiempo de espera de solicitud para todas las solicitudes que llegan a un servlet mío (o a todos mis servlets)? ¿Es eso, como creo, una propiedad de contenedores? Además, ¿cómo afecta esto a los diferentes navegadores? ¿Todos cumplen con el parámetro que dicta el contenedor? O tal vez el tiempo de espera de solicitud ni siquiera es algo que pueda controlar y cada navegador decide por sí mismo. (Para que quede claro, no estoy hablando del tiempo de espera de la sesión)Cómo especificar el parámetro Http Request timeout en el contenedor de servlets de Java

+1

Buena pregunta. He leído su comentario en la última respuesta y me pregunto qué enfoque ha elegido para asegurarse de que la solicitud no se cierre. Estoy tratando de hacer Comet y no sé cómo hacerlo bien. ¿Podría sugerir una solución? ¡Gracias! – Dragos

+0

@Dragos Terminé simplemente implementando un mecanismo de interrogación Largo simple que devolvió la solicitud al usuario después de ~ 29 segundos (que es menos de 30 segundos [el límite de IE]). Lo que haría ahora si tuviera el mismo problema era intentar usar la API de websockets. – Ittai

+0

¿Está buscando aquí un tiempo de espera tal que "en el momento x" borre la respuesta actual y mate el hilo actual, de modo que el navegador reciba datos lo suficientemente rápido? Los navegadores FWIW en estos días parecen esperar "muchos minutos" en una respuesta ... – rogerdpack

Respuesta

14

El tiempo de espera de un cliente (es decir, cuánto tiempo espera una respuesta a una solicitud HTTP) se determina en el cliente. Para IE, vea this, y para Firefox vea this.

No puede controlar este tiempo de espera del servidor.

+0

Antes que nada, gracias por la respuesta, esto no se puede cambiar programáticamente en el lado del cliente (a través de JavaScript) ¿verdad? – Ittai

+0

No lo creo, no. –

2

No puede controlar el tiempo de espera del cliente desde el servidor. Sin embargo, es posible que pueda enviar datos de vuelta al cliente de vez en cuando mientras su operación de larga ejecución está ocupada. Esto evitará que el cliente agote el tiempo de espera y se puede usar para mostrar el progreso al usuario, etc. Escriba datos en OutputStream o Writer obtenidos de la respuesta y llame al flujo para enviar datos parciales al cliente.

+0

¿cómo se puede obtener esta información parcial si se usa xmlHttpRequest? He leído que en IE no puede acceder a los datos hasta que finalice la solicitud – Ittai

+1

Sí, pero el cliente no debe esperar hasta que lleguen algunos datos. –

+0

Tiene razón, pero es un poco más complicado porque Estoy implementando Comet así que usaré 'Long Polling' y necesitaré un tiempo de espera más largo para guardar las solicitudes o usar Streaming, que es lo que pensé que David estaba sugiriendo. Gracias de todas formas. – Ittai

5

A pesar de que no se puede controlar el tiempo de espera del cliente, puede hacer que el servidor muy impaciente :) Por ejemplo, en Tomcat, se puede hacer esto en su conector,

<Connector port="8080" 
    ... 
    connectionTimeout ="5000" 
    disableUploadTimeout="false" /> 

Esto hace que el servidor sólo se espere 5 segundos y cierra la conexión. El navegador recibirá un error de conexión cerrada. Puede tratarlo igual que el tiempo de espera en el cliente.

Por supuesto, esto solo funciona si el tiempo de espera es causado por el servidor, no hay problemas de conectividad entre el navegador y el servidor.

+0

"timeout" no hay tal parámetro en Tomcat Connector – robsf

+2

El nombre del parámetro es connectionTimeout dentro de la etiqueta Connector, así:

Cuestiones relacionadas