Recientemente, encontré un problema al sincronizar datos. Después de insertar datos en segundo plano, los sincronicé con otros departamentos. En pocas palabras, en realidad es llamar a la interfaz proporcionada por la otra parte y realizar llamadas de solicitud HTTP. Luego encontré un problema más tarde. Si se solicita una solicitud HTTP, el tiempo de espera de la solicitud, la interrupción falló y la excepción de IO es realmente posible. Si es normal abrir una página web, está bien, pero cuando no se puede abrir, la cerrará o la página le mostrará información. Sin embargo, la sincronización no se puede hacer. Una vez que la solicitud falla, los datos deben sincronizarse correctamente. Hoy, me doy cuenta de la importancia de este problema.
Cadena httpurl = "https://www.baidu.com/s?ie=utf-8&tn=90594569_hao_pg&wd=1"; Url url = nulo; Httpurlconnection httpconn = null; Resultado de cadena = ""; Pruebe {String Dirección = httpurl; url = nueva url (dirección); httpconn = (httpurlconnection) url.openconnection (); // Se puede usar una conexión URL para la entrada y/o salida. Establezca el indicador // doInput en verdadero si tiene la intención de usar la conexión URL para la entrada, // falso si no. El valor predeterminado es verdadero. // La conexión de URL se puede usar para la entrada o salida. Si desea conectar la entrada con URL, configure la etiqueta doInput en verdadero. // La entrada y la salida están dirigidas a las computadoras, y si lo considera desde la perspectiva de un programador, a menudo se confundirá. // Entrada de entrada y salida de salida, ¿no se lee desde la salida o escribe desde la entrada? De hecho, por el contrario, la entrada de entrada se ingresa en la computadora y la computadora puede leerla, por lo que es de la lectura de entrada, y la salida es la salida de la computadora, que se realiza a través de la escritura de salida. httpconn.setDoOutput (falso); // Entonces, si SetDoInput (false), no puede leer cuando desea leer de UrlConnection // no puede leer desde UrlConnection si doInput = false (llame setDoInput (true)) httpconn.setdoinput (true); // El tiempo de tiempo de espera del establecimiento de conexión y el tiempo de tiempo de espera de datos también se leen, httpconn.setConnectTimeOut (6000000); httpconn.setreadtimeout (6000000); httpconn.setRequestMethod ("get"); httpconn.connect (); // Obtener el código de estado int código = httpconn.getResponseCode (); System.out.println (código); // Leer la solicitud HTTP Respuesta BufferedReader lector = new BufferedReader (new InputStreamReader (httpconn.getInputStream ())); Línea de cadena; while ((línea = lector.readline ())! = null) {result = resultado + línea + "/n"; } System.out.println (resultado); // Cerrar IO y conectar Reader.Close (); httpconn.disconnect (); } capt (excepción e) {log.error (e); } finalmente {if (httpconn! = null) httpconn.disconnect (); }El código parece estar escrito en Little, y los lugares donde los recursos deben lanzarse también se lanzan. Si debe llamar a la salida del registro, también lo llamará. De hecho, el problema es el manejo de excepciones. Pensé que algunas cosas no estaban sincronizadas antes debido al problema de tiempo de espera de conexión. Así que capté especialmente la excepción de SocketTimeOutException. Después de mirar el registro más tarde, descubrí que era un problema con el servidor en la interfaz de sincronización e informé un error 502. De hecho, la excepción es una excepción de IO.
No importa en ese caso, después de que ocurra este problema, debemos enviar la solicitud nuevamente y confirmar que la otra parte se ha sincronizado de acuerdo con el resultado devuelto por la interfaz. Si hay un problema temporal con el servidor, podemos detenerlo por un corto período de tiempo y luego solicitarlo nuevamente.
Entonces, el método que viene a la mente es que, dado que el requisito de sincronización en tiempo real no es alto, el intervalo puede ser más largo. Luego bucle y comience el hilo nuevamente, intervalo entre 5 minutos cada vez hasta que el resultado sea normal.
Catch (Exception e) {for (int i = 0; i <6; i ++) {Thread t = new Thread () {public void run () {get ();}}; t.Start (); if (resultado.equals ("ok")) {break; } try {thread.sleep (300000); } capt (interruptedException e2) {log.error (e2); }} log.error (e); }Lo anterior es una compilación de la información sobre el tiempo de espera de Java HttpurlConnection y el manejo de excepciones IO. Continuaremos agregando información relevante en el futuro. ¡Gracias por su apoyo para este sitio!