java.net.SocketTimeoutException: Gelesene Zeit überschritten

8

Ich habe eine Anwendung mit Client-Server-Architektur. Der Kunde Verwenden Sie Java Web Start mit Java Swing / AWT und der Server verwendet HTTP Server / Servlet mit Kater. Die Kommunikation erfolgt aus der Serialisierung von Objekten, erstellen Sie ein ObjectOutput serialisiert ein Byte-Array und sendet es an den Server jeweils genannt ObjectInputStream und deserializes.

Die Anwendung folgt der korrekten Kommunikation mit einem bestimmten Zeit der Gleichzeitigkeit, wo Fehler angezeigt werden "SocketException-Lesezeitlimit" Der Fehler tritt auf, wenn der Server die Methode aufruft ObjectInputStream.getObject () in meiner Servlet doPost-Methode.

Der Tomcat wird langsam und die Fehler beginnen, die Antwortzeit des Servers bis zur Absturzzeit zu verringern, wo ich den Server neu starten muss und nachdem alles funktioniert.

Jemand hat dieses Problem durchgemacht?

Kundencode

%Vor%

Servercode

%Vor%

input.readObject () ist der Fehler

    
Rafael Soto 20.03.2010, 02:25
quelle

2 Antworten

10

Sie haben uns nicht viele Informationen gegeben, insbesondere über die Kundenseite. Aber mein Verdacht ist, dass die Client-Seite ist:

  • Fehler beim Festlegen der Kopfzeile für die Inhaltslänge (oder beim Festlegen des falschen Werts),
  • Fehler beim Leeren des Ausgabestroms und / oder
  • schließt nicht die Ausgabeseite des Sockets.

Mysteriös.

Basierend auf Ihrer aktualisierten Frage sieht es so aus, als ob es keines der oben genannten wäre. Hier sind ein paar andere Möglichkeiten:

  • Aus irgendeinem Grund blockiert die Client-Seite entweder vollständig während der Serialisierung oder nimmt eine SEHR LANGE ZEIT.
  • Es gibt einen Proxy zwischen dem Client und dem Server, der Probleme verursacht.
  • Sie haben lastbezogene Netzwerkprobleme oder Netzwerkhardwareprobleme.

Eine weitere mögliche Erklärung ist, dass Sie ein Speicherleck haben und dass die Verlangsamung dadurch verursacht wird, dass der GC immer mehr Zeit benötigt, wenn Ihnen der Speicher ausgeht. Dies wird in den GC-Protokollen angezeigt, wenn Sie sie aktiviert haben.

    
Stephen C 20.03.2010 03:11
quelle
0

Ich denke, dass bei hoher Parallelität das in Tomcat festgelegte Socket-Timeout abgelaufen ist und die Verbindung geschlossen ist. Der nächste von Tomcat für diese Verbindung gelesene Wert ist größer als das Server-Socket-Timeout, das auf dem Server angegeben ist.
Wenn Sie dieses Problem vermeiden möchten, müssen Sie das Timeout auf der Serverseite erhöhen, das in Ihrem Fall abgelaufen ist. Aber nicht ratsam.
Übrigens hast du nicht genug Informationen gegeben. Haben Sie die Anzahl der Threads für die Verbindung in Tomcat erhöht? Wenn Sie das getan hätten, wäre das sicher passiert.

    
vetri 29.08.2012 13:15
quelle