في الآونة الأخيرة ، وجدت مشكلة عند مزامنة البيانات. بعد إدخال البيانات في الخلفية ، قمت بمزامنةها مع الإدارات الأخرى. بكل بساطة ، فهو في الواقع هو استدعاء الواجهة التي يوفرها الطرف الآخر وإجراء مكالمات طلب HTTP. ثم وجدت مشكلة لاحقًا. إذا تم طلب طلب HTTP ، فإن مهلة الطلب وفشل المقاطعة ، واستثناء IO ممكن بالفعل. إذا كان من الطبيعي فتح صفحة ويب ، فلا بأس ، ولكن عندما لا يمكن فتحها ، ستغلقها ، أو ستعرض الصفحة معلومات لك. ومع ذلك ، لا يمكن القيام التزامن. بمجرد فشل الطلب ، يجب مزامنة البيانات بشكل صحيح. اليوم ، أدرك أهمية هذه المشكلة.
String 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 على صواب إذا كنت تنوي استخدام اتصال عنوان URL للإدخال ، // false إذا لم يكن الأمر كذلك. الافتراضي صحيح. // يمكن استخدام اتصال URL للإدخال أو الإخراج. إذا كنت ترغب في توصيل الإدخال بعنوان URL ، فقم بتعيين علامة Doinput على True. // تهدف الإدخال والمخرجات إلى أجهزة الكمبيوتر ، وإذا اعتبرتها من منظور المبرمج ، فغالبًا ما يتم الخلط بينك. // إدخال الإدخال وإخراج الإخراج ، فهل لا تقرأ من الإخراج أو الكتابة من الإدخال؟ في الواقع ، على العكس من ذلك ، يتم إدخال إدخال الإدخال // في الكمبيوتر ويمكن للكمبيوتر قراءته ، لذلك هو من قراءة الإدخال ، والإخراج هو إخراج الكمبيوتر ، الذي هو من خلال كتابة الإخراج. httpconn.setDooutput (false) ؛ // لذا ، إذا كان setDoInput (false) ، لا يمكنك القراءة عندما تريد القراءة من urlConnection // لا يمكن القراءة من urlconnection إذا كان doinput = false (call setDoInput (true)) httpconn.setDoInput (true) ؛ // يتم أيضًا قراءة وقت مهلة إنشاء الاتصال ووقت مهلة البيانات ، httpconn.setConnectTimeout (6000000) ؛ httpconn.setReadTimeout (6000000) ؛ httpconn.setRequestMethod ("get") ؛ httpconn.connect () ؛ // احصل على رمز الحالة int = httpconn.getResPonsecode () ؛ System.out.println (Code) ؛ // اقرأ HTTP طلب استجابة BufferedReader Reader = جديد BufferedReader (New InputStreamReader (httpconn.getInputStream ())) ؛ خط السلسلة بينما ((line = reader.ReadLine ())! = null) {result = result + line + "/n" ؛ } system.out.println (result) ؛ // أغلق IO و Connect reader.close () ؛ httpconn.disconnect () ؛ } catch (استثناء e) {log.error (e) ؛ } أخيرًا {if (httpconn! = null) httpconn.disconnect () ؛ }يبدو أن الكود مكتوب في Little ، ويتم إصدار الأماكن التي يجب إصدار الموارد التي يجب إصدارها أيضًا. إذا كان يجب عليك الاتصال بإخراج السجل ، فستتصل به أيضًا. في الواقع ، المشكلة هي التعامل مع الاستثناءات. اعتقدت أن بعض الأشياء لم تتم مزامنتها من قبل بسبب مشكلة مهلة الاتصال. لذلك ، اشتعلت بشكل خاص استثناء SockettimeOutException. بعد النظر إلى السجل لاحقًا ، وجدت أنها كانت مشكلة في الخادم على واجهة التزامن وأبلغت عن خطأ 502. في الواقع ، الاستثناء هو استثناء IO.
بغض النظر عن هذه الحالة ، بعد حدوث هذه المشكلة ، يجب أن نرسل الطلب مرة أخرى ونؤكد أن الطرف الآخر قد تمت مزامنته وفقًا للنتيجة التي تم إرجاعها بواسطة الواجهة. إذا كانت هناك مشكلة مؤقتة مع الخادم ، فيمكننا إيقافها لفترة قصيرة من الزمن ثم طلبها مرة أخرى.
لذا فإن الطريقة التي تتبادر إلى الذهن هي أنه نظرًا لأن متطلبات التزامن في الوقت الفعلي ليست عالية ، فقد يكون الفاصل الزمني أطول. ثم حلقة وابدأ الخيط مرة أخرى ، الفاصل بين 5 دقائق في كل مرة حتى تكون النتيجة طبيعية.
catch (استثناء e) {for (int i = 0 ؛ i <6 ؛ i ++) {thread t = new thread () {public void run () {get () ؛}} ؛ T.Start () ؛ if (result.equals ("ok")) {break ؛ } جرب {thread.sleep (300000) ؛ } catch (interruptedException e2) {log.error (e2) ؛ }} log.error (e) ؛ }ما سبق هو عبارة عن مجموعة من المعلومات الخاصة بـ Java HttpurlConnection Timeout ومعالجة استثناءات IO. سنستمر في إضافة المعلومات ذات الصلة في المستقبل. شكرا لك على دعمك لهذا الموقع!