Seit das SEOTcs-System am 24. November den SEO-Scoring-Algorithmus aktualisiert hat, ist ein Problem aufgetreten, das mich beschäftigt. Während der Ausführung der Java-Datenjob-Aufgabe wird häufig der folgende Fehler gemeldet:
„2011-12-03 18:00:32 DefaultHttpClient [INFO] E/A-Ausnahme (java.net.SocketException) beim Verarbeiten der Anfrage abgefangen: Verbindung vom Peer zurückgesetzt: Socket-Schreibfehler
03.12.2011 18:00:32 DefaultHttpClient [INFO] Anfrage wird wiederholt“…
Zu diesem Zweck habe ich einige Websites auf Chinesisch und Englisch durchsucht, jede Ecke durchsucht, die ich finden konnte, und den Grund gefunden, warum diese Java-Ausnahme sowohl auf der Client- als auch auf der Serverseite auftreten kann zwei Gründe:
1. Wenn der Socket an einem Ende geschlossen ist (oder aktiv geschlossen ist oder aufgrund eines abnormalen Ausgangs geschlossen ist), sendet das andere Ende weiterhin Daten und das erste gesendete Datenpaket löst diese Ausnahme aus (Connect-Reset durch Peer).
2. Ein Ende wird beendet, aber die Verbindung wird beim Beenden nicht geschlossen. Wenn das andere Ende Daten aus der Verbindung liest, wird die Ausnahme (Verbindungs-Reset) ausgelöst. Einfach ausgedrückt wird es durch Lese- und Schreibvorgänge verursacht, nachdem die Verbindung getrennt wurde.
Deshalb dachte ich einfach, dass es durch das Festlegen einiger Socket-Timeouts gelöst werden könnte:
Aber nach dem Einrichten ist die Situation immer noch dieselbe.
Dieses Problem beschäftigt mich seit mehreren Tagen, und ich habe jeden Tag darüber nachgedacht und Vergleichstests durchgeführt, um den Code herauszufinden, der dieses Problem verursacht hat. Unter der Voraussetzung der gleichen Anzahl von Schlüsselwörtern muss ich mir überlegen, warum Es gab keinen Fehler in den Ranking-Daten der vorherigen Batch-Abfrage, aber in letzter Zeit wurden häufig Fehler gemeldet. Warum ist das so? Blockiert die angeforderte Schnittstellen-Website die IP unseres Servers? Dieser Grund ist nicht ausreichend. Er muss daran liegen, dass die Verbindung irgendwo im Programm nicht ordnungsgemäß freigegeben wurde!
Unter der Leitung dieser Idee habe ich heute nach mehreren Tagen kontinuierlicher harter Arbeit und Übung endlich den Kern des Problems entdeckt, das durch die Timer-Methode verursacht wird! Die Situation ist wie folgt. In den letzten Tagen habe ich einige Batch-Aufgaben manuell ausgelöst und festgestellt, dass bei einem Filterrankingwert von 100 weiterhin der Fehler „java.net.SocketException: Connection reset in java“ ausgegeben wird und der Bildschirm angezeigt wird Nach sorgfältigem Vergleich dieses Timer-Codes ist die Aktualisierung besonders leistungsfähig
Schließlich wurde mir plötzlich klar, ja! Hier liegt ein Problem vor, lassen Sie es mich selbst analysieren:
Bei einem Funktionswert ist der von ihm zurückgegebene Wert ein kritischer Wert, aber in meiner Timer-Methode wird davon ausgegangen, dass, wenn der zurückgegebene Wert ein kritischer Wert ist, er gezwungen wird, die Ausführung dieser Methode innerhalb von 10 Sekunden fortzusetzen, und diese Methode soll dies tun Um bestimmte Daten des Quellcodes auf einer Seite zu erhalten, benötigt jede Ausführung dieser Methode mehrere zehn Millisekunden, was dem Erstellen entspricht Es wird eine Socket-Verbindung hergestellt, aber da sie immer den kritischen Wert zurückgibt, stellt diese Methode innerhalb von 10 Sekunden kontinuierlich eine Socket-Verbindung her, um Daten abzurufen. Wenn diese Methode jedes Mal ausgeführt wird, dauert es etwa 80 ms (nach jedem Test). einer solchen Methode beträgt etwa 80 Millisekunden) und innerhalb von 10 Sekunden werden 10*1000/80 erstellt. = 125 Socket-Verbindungen, d. h. 12,5 Socket-Verbindungen werden pro Sekunde hergestellt. Da es sich außerdem um ein Filterprogramm handelt, werden in wenigen Sekunden kontinuierlich mehrere kritische Werte angezeigt für die gleiche Website-Seite wird sehr stark ansteigen und Hunderte oder sogar Tausende erreichen, was dazu führt, dass die Anzahl der Anforderungsverbindungen, die auf die Verarbeitung warten, zu hoch ist:
Warum haben Sie diese Timer-Methode überhaupt mehrmals verwendet, um einen stabilen Datenwert zu erhalten? Aber jetzt, wo ich darüber nachdenke, sind die negativen Auswirkungen so kostspielig und der Effekt kann nicht unterschätzt werden. , aber nach mehreren Tagen umfassender Analyse und Tests wurde der Übeltäter endlich entdeckt. Nachdem das Problem gelöst war, fühlte ich mich plötzlich erleichtert und ich konnte ruhig schlafen. . .