เมื่อเร็ว ๆ นี้ฉันพบปัญหาเมื่อซิงค์ข้อมูล หลังจากแทรกข้อมูลในพื้นหลังฉันจะซิงโครไนซ์กับแผนกอื่น ๆ หากต้องการพูดง่ายๆก็คือการเรียกอินเทอร์เฟซที่จัดทำโดยบุคคลอื่นและโทรหา HTTP คำขอ จากนั้นฉันก็พบปัญหาในภายหลัง หากมีการร้องขอคำขอ HTTP การหมดเวลาการร้องขอการขัดจังหวะล้มเหลวและข้อยกเว้น IO เป็นไปได้จริง หากเป็นเรื่องปกติที่จะเปิดหน้าเว็บมันก็ใช้ได้ แต่เมื่อไม่สามารถเปิดได้คุณจะปิดหรือหน้าจะแสดงข้อมูลให้คุณ อย่างไรก็ตามการซิงโครไนซ์ไม่สามารถทำได้ เมื่อคำขอล้มเหลวข้อมูลจะต้องซิงโครไนซ์อย่างถูกต้อง วันนี้ฉันตระหนักถึงความสำคัญของปัญหานี้
สตริง httpurl = "https://www.baidu.com/s?ie=utf-8&tn=90594569_hao_pg&wd=1"; url url = null; httpurlConnection httpconn = null; สตริงผลลัพธ์ = ""; ลอง {string address = httpurl; url = url ใหม่ (ที่อยู่); httpConn = (httpurlconnection) url.openconnection (); // การเชื่อมต่อ URL สามารถใช้สำหรับอินพุตและ/หรือเอาต์พุต ตั้งค่า // doinput Flag เป็น TRUE หากคุณตั้งใจจะใช้การเชื่อมต่อ URL สำหรับอินพุต // FALSE ถ้าไม่ ค่าเริ่มต้นเป็นจริง // การเชื่อมต่อ URL สามารถใช้สำหรับอินพุตหรือเอาต์พุต หากคุณต้องการเชื่อมต่ออินพุตด้วย URL ให้ตั้งค่าแท็ก doinput เป็น TRUE // อินพุตและเอาต์พุตมีจุดมุ่งหมายที่คอมพิวเตอร์และหากคุณพิจารณาจากมุมมองของโปรแกรมเมอร์คุณมักจะสับสน // อินพุตอินพุตและเอาต์พุตเอาต์พุตจากนั้นจะไม่อ่านจากเอาต์พุตหรือเขียนจากอินพุต? ในความเป็นจริงในทางตรงกันข้าม // อินพุตอินพุตเป็นอินพุตลงในคอมพิวเตอร์และคอมพิวเตอร์สามารถอ่านได้ดังนั้นมันจึงมาจากการอ่านอินพุตและเอาต์พุตเป็นเอาต์พุตคอมพิวเตอร์ซึ่งผ่านการเขียนเอาต์พุต httpconn.setDooutput (false); // ดังนั้นหาก SetDoInput (เท็จ) คุณไม่สามารถอ่านได้เมื่อคุณต้องการอ่านจาก urlConnection // ไม่สามารถอ่านจาก urlConnection ได้หาก doinput = false (call setDoInput (จริง)) httpConn.SetDoInput (จริง); // เวลาการหมดเวลาการเชื่อมต่อการเชื่อมต่อและเวลาหมดเวลาข้อมูลถูกอ่านเช่นกัน httpconn.setConnectTimeout (6000000); httpconn.setReadtimeout (6000000); httpconn.setRequestMethod ("รับ"); httpconn.connect (); // รับรหัสสถานะรหัส int = httpConn.getResponsecode (); System.out.println (รหัส); // อ่าน http response bufferedreader reader = ใหม่ bufferedReader (ใหม่ inputStreamReader (httpconn.getInputStream ())); สายสตริง; ในขณะที่ ((line = reader.readline ())! = null) {result = result = line + "/n"; } system.out.println (ผลลัพธ์); // ปิด io และเชื่อมต่อ reader.close (); httpconn.disconnect (); } catch (exception e) {log.error (e); } ในที่สุด {ถ้า (httpconn! = null) httpconn.disconnect (); -ดูเหมือนว่ารหัสจะถูกเขียนเป็นเพียงเล็กน้อยและสถานที่ที่ควรปล่อยทรัพยากรได้รับการปล่อยตัว หากคุณควรเรียกเอาต์พุตบันทึกคุณจะเรียกด้วย ในความเป็นจริงปัญหาคือการจัดการข้อยกเว้น ฉันคิดว่าบางสิ่งไม่เคยซิงโครไนซ์มาก่อนเพราะปัญหาการหมดเวลาเชื่อมต่อ ดังนั้นฉันจึงจับข้อยกเว้น SocketTimeOutException เป็นพิเศษ หลังจากดูบันทึกในภายหลังฉันพบว่ามันเป็นปัญหากับเซิร์ฟเวอร์บนอินเทอร์เฟซการซิงโครไนซ์และรายงานข้อผิดพลาด 502 อันที่จริงข้อยกเว้นคือข้อยกเว้น IO
ไม่ว่าในกรณีนั้นหลังจากปัญหานี้เกิดขึ้นเราจะต้องส่งคำขออีกครั้งและยืนยันว่าอีกฝ่ายได้รับการซิงโครไนซ์ตามผลลัพธ์ที่ส่งคืนโดยอินเทอร์เฟซ หากมีปัญหาชั่วคราวกับเซิร์ฟเวอร์เราสามารถหยุดชั่วคราวได้ในช่วงเวลาสั้น ๆ จากนั้นขออีกครั้ง
ดังนั้นวิธีการที่นึกถึงก็คือเนื่องจากความต้องการแบบเรียลไทม์ของการซิงโครไนซ์ไม่สูงช่วงเวลาอาจยาวขึ้น จากนั้นวนรอบและเริ่มเธรดอีกครั้งช่วงเวลาระหว่าง 5 นาทีในแต่ละครั้งจนกว่าผลลัพธ์จะเป็นปกติ
catch (Exception E) {สำหรับ (int i = 0; i <6; i ++) {เธรด t = เธรดใหม่ () {โมฆะสาธารณะเรียกใช้ () {get ();}}; T.Start (); if (result.equals ("ตกลง")) {break; } ลอง {thread.sleep (300000); } catch (interruptedException e2) {log.error (e2); }} log.error (e); -ข้างต้นเป็นการรวบรวมข้อมูลเกี่ยวกับการหมดเวลา Java httpurlconnection และการจัดการข้อยกเว้นของ IO เราจะยังคงเพิ่มข้อมูลที่เกี่ยวข้องในอนาคต ขอบคุณสำหรับการสนับสนุนเว็บไซต์นี้!