2009-09-12 14 views
22

J'essaie de comprendre où je peux configurer un délai d'attente de requête pour toutes les demandes arrivant à une servlet de la mienne (ou de toutes mes servlets)? Est-ce, comme je pense, une propriété de conteneur? En outre, comment cela affecte-t-il différents navigateurs? Sont-ils tous conformes au paramètre que le conteneur impose? Ou peut-être que le délai d'attente de la requête n'est même pas quelque chose que je peux contrôler et que chaque navigateur décide seul? (Pour être clair, je ne parle pas de délai d'attente de session)Comment spécifier le paramètre de délai d'attente Http Request sur le conteneur de servlets Java

+1

Belle question. J'ai lu votre commentaire à la dernière réponse et je me demandais quelle approche vous avez choisie pour vous assurer que la demande n'est pas close. J'essaie de faire Comet moi-même et je ne sais pas comment faire les choses correctement. Pourriez-vous suggérer une solution? Merci! – Dragos

+0

@Dragos Je me suis contenté de mettre en œuvre un simple mécanisme d'interrogation longue qui renvoyait la requête à l'utilisateur après ~ 29 secondes (ce qui est inférieur à 30 secondes [la limite IE]). Ce que je ferais maintenant si je faisais face au même problème était d'essayer d'utiliser l'API websockets. – Ittai

+0

Donc vous cherchez ici un timeout tel que "at time x" efface la réponse en cours et tue le thread actuel, pour que le navigateur reçoive les données assez rapidement? FWIW navigateurs ces jours-ci semblent attendre "beaucoup de minutes" sur une réponse ... – rogerdpack

Répondre

14

Le délai d'attente d'un client (c'est-à-dire le temps qu'il attend pour une réponse à une requête HTTP) est déterminé sur le client. Pour IE, voir this, et pour Firefox, voir this.

Vous ne pouvez pas contrôler ce délai d'attente à partir du serveur.

+0

Tout d'abord je vous remercie pour la réponse, cela ne peut pas être modifié par programme du côté client (via JavaScript) non? – Ittai

+0

Je ne crois pas, non. –

2

Vous ne pouvez pas contrôler le délai d'expiration du client à partir du serveur. Cependant, vous pourrez peut-être renvoyer des données au client de temps en temps pendant que votre opération de longue durée est occupée. Cela empêchera le client de temporiser et peut être utilisé pour afficher la progression à l'utilisateur, etc. Écrire des données dans le OutputStream ou Writer obtenu à partir de la réponse et appeler flush pour envoyer des données partielles au client.

+0

comment peut-on obtenir ces données partielles si on utilise xmlHttpRequest? J'ai lu que dans IE vous ne pouvez pas accéder aux données jusqu'à ce que la demande est terminée – Ittai

+1

Oui, mais le client ne devrait pas expirer aussi longtemps que certaines données arrivent. –

+0

Vous avez raison, mais c'est un peu plus compliqué parce que J'implémente Comet, donc je vais utiliser 'Long Polling' et donc avoir besoin d'un délai plus long pour sauvegarder les requêtes ou utiliser Streaming, ce que David suggérait. En tout cas merci. – Ittai

5

Même si vous ne pouvez pas contrôler délai d'attente du client, vous pouvez faire serveur très impatient :) Par exemple, sur Tomcat, vous pouvez le faire dans votre connecteur,

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

Cela ne fait que serveur attendez 5 secondes et fermez la connexion. Le navigateur obtiendra une erreur de connexion fermée. Vous pouvez traiter le même que le délai d'attente dans le client.

Bien sûr, cela ne fonctionne que si le délai d'attente est causé par le serveur, pas les problèmes de connectivité entre le navigateur et le serveur.

+0

"timeout" il n'y a pas de tel paramètre dans Tomcat Connector – robsf

+2

Le nom du paramètre est connectionTimeout dans la balise Connector, comme ceci: