web-dev-qa-db-fra.com

java.net.SocketTimeoutException: la lecture a expiré sous tomcat

J'ai une application Web basée sur Tomcat. Je reçois de façon intermittente l'exception suivante,

Caused by: Java.net.SocketTimeoutException: Read timed out
    at Java.net.SocketInputStream.socketRead0(Native Method)
    at Java.net.SocketInputStream.read(SocketInputStream.Java:150)
    at Java.net.SocketInputStream.read(SocketInputStream.Java:121)
    at org.Apache.coyote.http11.InternalInputBuffer.fill(InternalInputBuffer.Java:532)
    at org.Apache.coyote.http11.InternalInputBuffer.fill(InternalInputBuffer.Java:501)
    at org.Apache.coyote.http11.InternalInputBuffer$InputStreamInputBuffer.doRead(InternalInputBuffer.Java:563)
    at org.Apache.coyote.http11.filters.IdentityInputFilter.doRead(IdentityInputFilter.Java:124)
    at org.Apache.coyote.http11.AbstractInputBuffer.doRead(AbstractInputBuffer.Java:346)
    at org.Apache.coyote.Request.doRead(Request.Java:422)
    at org.Apache.catalina.connector.InputBuffer.realReadBytes(InputBuffer.Java:290)
    at org.Apache.Tomcat.util.buf.ByteChunk.substract(ByteChunk.Java:431)
    at org.Apache.catalina.connector.InputBuffer.read(InputBuffer.Java:315)
    at org.Apache.catalina.connector.CoyoteInputStream.read(CoyoteInputStream.Java:200)
    at Java.nio.channels.Channels$ReadableByteChannelImpl.read(Channels.Java:385)

Malheureusement, je n'ai pas accès au client. J'essaie donc de confirmer, pour diverses raisons, que cela peut arriver,

  1. Le serveur tente de lire les données à partir de la demande, mais cela prend plus de temps que le délai d'expiration pour que les données arrivent du client. Le délai d'attente ici est généralement celui du connecteur Tomcat -> attribut connectionTimeout.

  2. Le client a un délai de lecture défini et le serveur met plus de temps pour répondre.

  3. L’un des sujets que j’ai parcourus a dit que cela pouvait arriver avec une concurrence élevée et si la fonction keepalive était activée.

Pour le n ° 1, la valeur initiale que j'avais définie était de 20 secondes.

En attendant, si l’un d’entre vous peut vous donner un avis d’experts, cela sera vraiment utile. Ou d'ailleurs toute autre raison à laquelle vous pourriez penser qui pourrait causer ce problème.

47
Vicky

Le serveur tente de lire les données à partir de la demande, mais cela prend plus de temps que le délai d'expiration pour que les données arrivent du client. Le délai d'attente ici est généralement celui du connecteur Tomcat -> attribut connectionTimeout.

Correct.

Le client a un délai de lecture défini et le serveur met plus de temps pour répondre.

Non, cela provoquerait un délai d'attente chez le client.

L’un des sujets que j’ai parcourus a dit que cela pouvait arriver avec une concurrence élevée et si la fonction keepalive était activée.

C'est évidemment une conjecture, et complètement incorrecte. Cela se produit si et seulement si aucune donnée n'arrive dans le délai imparti. Période. Load et keepalive et la concurrence n'ont absolument rien à voir avec cela.

Cela signifie simplement que le client n'envoie pas. Vous n'avez pas besoin de vous en préoccuper. Les clients du navigateur vont et viennent de toutes sortes de manières étranges.

36
user207421

Voici les instructions de base: -

  1. Recherchez le fichier "server.xml" dans le dossier "conf" situé sous le répertoire de base de Tomcat (c'est-à-dire %CATALINA_HOME%/conf/server.xml).
  2. Ouvrez le fichier dans un éditeur et recherchez <Connector.
  3. Localisez le connecteur approprié qui arrive à expiration - il s’agit généralement du connecteur HTTP, c’est-à-dire celui avec protocol="HTTP/1.1".
  4. Si une valeur connectionTimeout est définie sur le connecteur, il peut être nécessaire de l'augmenter, par exemple. de 20000 millisecondes (= 20 secondes) à 120000 millisecondes (= 2 minutes). Si aucune valeur de propriété connectionTimeout n'est définie sur le connecteur, la valeur par défaut est de 60 secondes. Si cela est insuffisant, il peut être nécessaire d'ajouter la propriété.
  5. Redémarrer Tomcat
4
Steve Chambers
Connection.Response resp = Jsoup.connect(url) //
                .timeout(20000) //
                .method(Connection.Method.GET) //
                .execute();

en fait, l'erreur survient lorsque vous avez un accès Internet lent, alors essayez de maximiser le délai d'expiration et votre code fonctionnera définitivement comme il fonctionne pour moi.

0
Rishabh Gupta