Java HttpURLConnection超時(shí)和IO異常處理
最近同步數(shù)據(jù)的時(shí)候發(fā)現(xiàn)了一個(gè)問(wèn)題,我本身后臺(tái)插入數(shù)據(jù)后給其他部門(mén)后臺(tái)做同步。說(shuō)簡(jiǎn)單一點(diǎn)其實(shí)就是調(diào)用對(duì)方提供的接口,進(jìn)行HTTP請(qǐng)求調(diào)用。然后后面發(fā)現(xiàn)問(wèn)題了。HTTP請(qǐng)求的話,有可能請(qǐng)求超時(shí),中斷失敗,IO異常其實(shí)都有可能,如果是平時(shí)打開(kāi)一個(gè)網(wǎng)頁(yè)還好,打不開(kāi)的時(shí)候,你會(huì)關(guān)掉,或者他頁(yè)面給你顯示信息。但是同步,不可以這樣做,一旦請(qǐng)求失敗,必須讓數(shù)據(jù)正確的同步,今天才意識(shí)到這個(gè)問(wèn)題的重要性。
String httpUrl = "https://www.baidu.com/s?ie=UTF-8&tn=90594569_hao_pg&wd=1"; URL url = null; HttpURLConnection httpConn = null; String result = ""; try { String address = httpUrl; url = new URL(address); httpConn = (HttpURLConnection) url.openConnection(); //A URL connection can be used for input and/or output. Set the //DoInput flag to true if you intend to use the URL connection for input, //false if not. The default is true. //URL連接可用于input或output。如果想用URL連接輸入,設(shè)置DoInput標(biāo)簽為true。 //輸入和輸出是針對(duì)計(jì)算機(jī)的,如果以程序員的角度考慮,經(jīng)常弄混。 //input輸入,output輸出,那么不是從output里read,input中write嗎,其實(shí)相反 //input輸入進(jìn)計(jì)算機(jī),計(jì)算機(jī)才能讀,所以是從input read,而output是計(jì)算機(jī)輸出,通過(guò)output write。 httpConn.setDoOutput(false); //所以如果setDoInput(false),想從URLConnection讀取時(shí)不能讀取 //Cannot read from URLConnection if doInput=false (call setDoInput(true)) httpConn.setDoInput(true); //連接建立超時(shí)時(shí)間還有讀取數(shù)據(jù)超時(shí)時(shí)間, httpConn.setConnectTimeout(600000); httpConn.setReadTimeout(600000); httpConn.setRequestMethod("GET"); httpConn.connect(); //獲取狀態(tài)碼 int code = httpConn.getResponseCode(); System.out.println(code); //讀http請(qǐng)求響應(yīng) BufferedReader reader = new BufferedReader(new InputStreamReader(httpConn.getInputStream())); String line; while ((line = reader.readLine()) != null) { result = result + line+"\n"; } System.out.println(result); //關(guān)閉IO和連接 reader.close(); httpConn.disconnect(); } catch(Exception e){ log.error(e); } finally{ if(httpConn!=null) httpConn.disconnect(); }
代碼看上去寫(xiě)的沒(méi)什么,該釋放資源的地方也釋放了。該打日志輸出的也打了。其實(shí)問(wèn)題就是異常的處理。之前以為一些東西沒(méi)有同步過(guò)去是因?yàn)檫B接超時(shí)的問(wèn)題。所以特地捕獲SocketTimeoutException異常,后面看了日志之后,發(fā)現(xiàn)是同步接口那邊服務(wù)器的問(wèn)題,報(bào)了502錯(cuò)誤。其實(shí)異常是IO異常。
無(wú)論是那種情況,我們都要在出現(xiàn)這種問(wèn)題之后,再次地把請(qǐng)求發(fā)送過(guò)去,根據(jù)接口返回的結(jié)果,確認(rèn)對(duì)方已經(jīng)同步到。如果服務(wù)器暫時(shí)性的出了問(wèn)題,我們可以暫停一小段時(shí)間后,然后再次請(qǐng)求。
所以暫時(shí)想到的方法是,由于同步的實(shí)時(shí)性要求不高,那么可以間隔的時(shí)間可以長(zhǎng)一點(diǎn)。然后循環(huán),另起線程,每次間隔5分鐘,直至結(jié)果正常。
catch(Exception e){ for (int i = 0; i < 6; i++) { Thread t = new Thread(){public void run(){get();}}; t.start(); if(result.equals("ok")){ break; } try { Thread.sleep(300000); } catch (InterruptedException e2) { log.error(e2); } } log.error(e); }
以上就是對(duì)Java HttpURLConnection超時(shí)和IO異常處理的資料整理,后續(xù)繼續(xù)補(bǔ)充相關(guān)資料,謝謝大家對(duì)本站的支持!
相關(guān)文章
Java實(shí)現(xiàn)將列表數(shù)據(jù)導(dǎo)出為PDF文件并添加水印
這篇文章主要為大家詳細(xì)介紹了如何使用Java實(shí)現(xiàn)把列表數(shù)據(jù)導(dǎo)出為PDF文件,同時(shí)加上PDF水印,文中的示例代碼講解詳細(xì),需要的可以參考下2024-02-02IDEA2022中部署Tomcat Web項(xiàng)目的流程分析
這篇文章主要介紹了IDEA2022中部署Tomcat Web項(xiàng)目,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-03-03Java 獲取指定日期的實(shí)現(xiàn)方法總結(jié)
以下是對(duì)Java中獲取指定日期的實(shí)現(xiàn)方法進(jìn)行了歸納總結(jié),需要的朋友可以參考下2013-07-07解決mybatis無(wú)法給帶有下劃線屬性賦值問(wèn)題
這篇文章主要介紹了解決mybatis無(wú)法給帶有下劃線屬性賦值問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-01-01SpringBoot整合Lettuce redis過(guò)程解析
這篇文章主要介紹了SpringBoot整合Lettuce redis過(guò)程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-10-10SpringSecurity之SecurityContextHolder使用解讀
這篇文章主要介紹了SpringSecurity之SecurityContextHolder使用解讀,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-03-03springboot實(shí)現(xiàn)rabbitmq的隊(duì)列初始化和綁定
這篇文章主要介紹了springboot實(shí)現(xiàn)rabbitmq的隊(duì)列初始化和綁定,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2018-10-10