Desde que el sistema SEOTcs actualizó el algoritmo de puntuación SEO el 24 de noviembre, ha surgido un problema que me ha estado molestando. A menudo se informará el siguiente error durante la ejecución de la tarea de trabajo de datos de Java:
"2011-12-03 18:00:32 DefaultHttpClient [INFO] Excepción de E/S (java.net.SocketException) detectada al procesar la solicitud: Conexión restablecida por parte del par: error de escritura en el socket
2011-12-03 18:00:32 DefaultHttpClient [INFO] Reintentando solicitud”…
Con este fin, busqué en algunos sitios web en chino e inglés, busqué en todos los rincones que pude encontrar y descubrí la razón por la cual ocurre esta excepción de Java tanto en el lado del cliente como en el del servidor. dos razones:
1. Si el socket en un extremo está cerrado (o activamente cerrado, o cerrado debido a una salida anormal), el otro extremo aún envía datos y el primer paquete de datos enviado desencadena esta excepción (conexión restablecida por par).
2. Un extremo sale, pero la conexión no se cierra al salir. Si el otro extremo está leyendo datos de la conexión, se generará la excepción (restablecimiento de la conexión). En pocas palabras, es causado por operaciones de lectura y escritura después de que se desconecta la conexión.
Entonces simplemente pensé que podría resolverse estableciendo algunos tiempos de espera de socket:
Pero después de configurar la situación sigue siendo la misma.
Este problema me ha preocupado durante varios días, y he estado pensando y haciendo pruebas comparativas todos los días para descubrir el código que causó este problema. No puedo evitar pensar, bajo la premisa de la misma cantidad de palabras clave, por qué. No hubo ningún error en los datos de clasificación de consultas por lotes anteriores, pero recientemente se han informado errores con frecuencia. ¿El sitio web de la interfaz solicitada está bloqueando la IP de nuestro servidor? ¡Esta razón no es suficiente! Debe ser causada por una falla al liberar la conexión correctamente en algún lugar del programa.
Bajo la guía de esta idea, después de varios días de arduo trabajo y práctica continuos, hoy finalmente descubrí la esencia del problema, ¡que es causado por el método del temporizador! La situación es así En los últimos días, activé manualmente algunas tareas por lotes y descubrí que cuando el valor de clasificación del filtro es 100, se seguirá apareciendo el error java.net.SocketException: Restablecimiento de conexión en Java y aparecerá la pantalla. La actualización es particularmente poderosa, después de comparar cuidadosamente este código de temporizador.
Finalmente, de repente me di cuenta, ¡sí! Hay un problema aquí, déjame analizarlo yo mismo:
Un valor de función, el valor que devuelve es un valor crítico, pero en mi método de temporizador, se juzga que si el valor devuelto es un valor crítico, lo obligará a continuar ejecutando ese método dentro de 10 segundos, y este método es Para obtener datos específicos del código fuente en una página, cada ejecución de este método consumirá decenas de milisegundos, lo que equivale a construir Se establece una conexión de socket, pero como siempre devuelve el valor crítico, este método establecerá continuamente una conexión de socket dentro de 10 segundos para obtener datos. Si este método se ejecuta cada vez, tomará aproximadamente 80 ms (después de la prueba, cada El tiempo de ejecución. de dicho método es de aproximadamente 80 milisegundos), y en 10 segundos, se crearán 10*1000/80. = 125 conexiones de socket, es decir, se establecerán 12,5 conexiones de socket por segundo. Además, dado que este es un programa de filtrado, aparecerán múltiples valores críticos juntos de forma continua, por lo que en unos segundos, el número de conexiones de socket. para la misma página del sitio web se disparará muy alto, llegando a cientos o incluso miles, lo que provocará que la cantidad de conexiones de solicitud en espera de ser procesadas sea demasiado alta:
¿Por qué utilizó este método de temporizador para ejecutar un método varias veces? La razón fue obtener un valor estable de datos. Pero ahora que lo pienso, el impacto negativo es muy costoso y el efecto no se puede subestimar. , pero después de varios días de análisis y pruebas exhaustivos, finalmente se descubrió al culpable. Una vez resuelto el problema, mi mente de repente se sintió aliviada y pude dormir tranquilamente. . .