50 votes

Délai de requête Tomcat

Dans mon application web, certaines requêtes durent plus de 20 secondes. Mais dans certaines situations, le code peut conduire à une boucle infinie ou quelque chose de similaire qui ralentit le serveur.

Je veux mettre un délai d'attente de 60 secondes pour les demandes du côté du serveur. Est-ce que cela est implémenté dans Tomcat ?

0 votes

Utilisez-vous Socket y ServerSocket ? car si c'est le cas, vous pouvez définir le délai d'attente à l'aide de la fonction SetSoTimeout méthode.

0 votes

@Eran, il développe une application web. Il ne peut pas accéder au socket du serveur ouvert par Tomcat.

2 votes

Je conteste vraiment le fait que vous ayez déployé du code qui parfois conduit à des boucles infinies :-)

53voto

beny23 Points 14428

Avec Tomcat 7, vous pouvez ajouter l'option Soupape de détection de fil coincé ce qui vous permettra d'identifier les fils qui sont "coincés". Vous pouvez configurer la valve dans l'élément Contexte des applications où vous voulez faire la détection :

<Context ...>
  ...
  <Valve 
    className="org.apache.catalina.valves.StuckThreadDetectionValve"
    threshold="60" />
  ...
</Context>

Cela permettrait d'écrire une entrée WARN dans le journal de tomcat pour tout thread qui prend plus de 60 secondes, ce qui vous permettrait d'identifier les applications et de les bannir car elles sont défectueuses.

Sur la base de la code source vous pouvez peut-être écrire votre propre valve qui tente d'arrêter le thread, mais cela aurait des répercussions sur le pool de threads et il y a un risque de confusion. aucun moyen fiable d'arrêter un thread en Java sans la coopération de ce thread...

27voto

Matthew Farwell Points 31257

Si vous essayez d'empêcher une requête de durer trop longtemps, la définition d'un délai d'attente dans Tomcat ne vous aidera pas. Comme le dit Chris, vous pouvez définir la valeur globale du délai d'attente pour Tomcat. Mais, à partir de Le connecteur Apache Tomcat - Mode d'emploi générique Délais d'attente voir la section Délai de réponse :

JK peut également utiliser un délai d'attente pour les réponses aux demandes. Ce délai d'attente ne pas le temps de traitement complet de la réponse. Il contrôle plutôt combien de temps entre des paquets de réponses consécutifs est autorisé.

Dans la plupart des cas, c'est ce que l'on souhaite réellement. Considérez par exemple les téléchargements de longue durée. Il ne serait pas possible de définir un de réponse global efficace, car les téléchargements peuvent durer plusieurs minutes. La plupart des applications ont cependant un temps de traitement limité avant de commencer pour renvoyer la réponse. Pour ces applications, vous pouvez définir un délai de réponse explicite. Les applications qui ne s'harmonisent pas avec les délais de réponse sont les applications de type "batch", les entrepôts de données et les applications de qui sont censées observer des temps de traitement longs.

Si JK abandonne l'attente d'une réponse, parce qu'un délai de réponse a été déclenché, il n'y a aucun moyen d'arrêter le traitement sur le backend. Bien que vous libériez ressources de traitement dans votre serveur web, la requête continuera à être continuer à s'exécuter sur le backend - sans aucun moyen de renvoyer un résultat une fois que le le délai de réponse s'est déclenché.

Ainsi, Tomcat détectera que la servlet n'a pas répondu dans le délai imparti et renverra une réponse à l'utilisateur, mais n'arrêtera pas le fil en cours . Je ne pense pas que tu puisses réaliser ce que tu veux faire.

9voto

Chris Points 532

Vous pouvez définir le délai d'attente par défaut dans le fichier 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"/>

0 votes

Existe-t-il un moyen de n'affecter que mon application ?

1 votes

Vous ne pouvez pas modifier le délai d'attente à partir du serveur, malheureusement, je peux me tromper.

21 votes

Le connectionTimeout est le temps pendant lequel Tomcat attendra la ligne de demande http une fois que la connexion est établie. Il n'affecte pas le temps d'attente du serveur pour la fin du traitement de la requête.

0voto

thcricketfan Points 49

Cet article traite de la définition des délais d'attente au niveau du serveur. http://www.coderanch.com/t/364207/Servlets/java/Servlet-Timeout-two-ways

Qu'est-ce qui fait que l'application passe en boucle infinie ? Si vous ouvrez des connexions vers d'autres ressources, vous pouvez envisager de fixer des délais d'attente pour ces connexions et d'envoyer une réponse appropriée lorsque ces délais sont dépassés.

0 votes

Pourquoi il y a une démarque sur ça ? La réponse est pertinente pour la question posée ici.

6 votes

Je suppose qu'il a été rejeté parce que l'article porte sur session délais d'attente

0voto

george Points 1555

Pour ceux qui, comme moi, n'apprécient aucune des solutions proposées ci-dessus, vous pouvez simplement mettre en œuvre vous-même une minuterie et arrêter l'exécution de la requête en déclenchant une exception d'exécution. Quelque chose comme ci-dessous :

                  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");
                 }

ou de préférence, utiliser le timeLimiter de java guava ici

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X