Tomcat expiration du délai de demande

dans mon application web il y a des requêtes qui 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 de requête de 60 secondes du côté du serveur. Est-ce mis en œuvre dans tomcat ?

Merci, Horatiu

37
demandé sur SkorpEN 2011-08-22 12:58:19

6 réponses

avec Tomcat 7, vous pouvez ajouter le StuckThreadDetectionValve qui vous permettra d'identifier les fils qui sont"collés". Vous pouvez configurer la vanne dans l'élément de Contexte, des applications où vous voulez le faire détecter:

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

ceci écrirait une entrée D'avertissement dans le journal tomcat pour tout thread qui prend plus de 60 secondes, ce qui vous permettrait d'identifier les applications et de les bannir parce qu'elles sont défectueuses.

basé sur le code source vous pouvez être en mesure d'écrire votre propre valve qui tente d'arrêter le fil, mais cela aurait des effets de choc sur le pool de fil et il ya aucune façon fiable d'arrêter un fil en Java sans la coopération de ce fil...

39
répondu beny23 2017-05-23 12:10:34

si vous essayez d'empêcher une requête de fonctionner trop longtemps, alors mettre un timeout dans Tomcat ne vous aidera pas. Comme Chris le dit, Vous pouvez définir la valeur globale de timeout pour Tomcat. Mais, à partir de , le connecteur Tomcat Apache-Generic HowTo Délais , voir la section délai de réponse:

JK peut également utiliser un timeout sur les réponses de requêtes. Ce délai d'attente n'est pas mesurer le temps de traitement complet de la réponse. Au lieu de cela il contrôle, combien de temps est permis entre les paquets de réponse consécutifs?

Dans la plupart des cas, c'est ce que l'on veut réellement. Considérons par exemple longue course de téléchargements. Vous ne seriez pas en mesure de définir un efficace délai global de réponse, parce que les téléchargements peuvent durer de nombreuses minutes. La plupart des demandes ont un délai de traitement limité avant de commencer pour retourner la réponse. Pour ces applications, vous pouvez créer une réponse explicite délai d'attente. Les Applications qui ne sont pas harmoniser avec la réponse les temps morts sont des applications de type de lot, l'entrepôt de données et la déclaration les demandes qui devraient respecter de longs délais de traitement.

si JK abandonne en attendant une réponse, parce qu'un délai de réponse s'est déclenché, il n'y a aucun moyen d'arrêter le traitement sur le backend. Bien que tu sois libre le traitement des ressources dans votre serveur web, la demande continuera à exécuter sur le backend, sans aucun moyen de renvoyer un résultat une fois la réponse délai de feu.

donc Tomcat va détecter que le servlet n'a pas répondu dans le délai imparti et va renvoyer une réponse à l'utilisateur, mais ne va pas arrêter le thread tournant . Je ne pense pas que tu puisses accomplir ce que tu veux faire.

20
répondu Matthew Farwell 2016-07-19 09:29:48

Vous pouvez définir le temps par défaut dans le serveur.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"/>
9
répondu Chris 2017-12-02 17:03:02

cet article parle du réglage des temps morts au niveau du serveur. http://www.coderanch.com/t/364207/Servlets/java/Servlet-Timeout-two-ways

Qu'est-ce qui fait que l'application entre en boucle infinie? Si vous ouvrez des connexions à d'autres ressources, vous voudrez peut-être mettre des temps morts sur ces connexions et envoyer une réponse appropriée lorsque ces temps morts se produisent.

1
répondu thcricketfan 2014-10-15 12:34:23

pour toute personne qui n'aime aucune des solutions affichées ci-dessus comme moi, alors vous pouvez tout simplement implémenter un timer vous-même et arrêter l'exécution de la requête en lançant 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 java guava timeLimiter ici

0
répondu george 2015-07-21 15:56:45

ajouter tomcat dans Eclipse

in Eclipse, as tomcat server, double click " Tomcat v7.0 serveur à Localhost", changer les propriétés comme indiqué dans les paramètres time out 45 à n'importe quelle sec vous aimez

-7
répondu Selvavinayagam Kanagavel 2014-01-11 11:08:09