Java HttpURLConnection超時(shí)和IO異常處理
最近同步數(shù)據(jù)的時(shí)候發(fā)現(xiàn)了一個(gè)問題,我本身后臺(tái)插入數(shù)據(jù)后給其他部門后臺(tái)做同步。說簡(jiǎn)單一點(diǎn)其實(shí)就是調(diào)用對(duì)方提供的接口,進(jìn)行HTTP請(qǐng)求調(diào)用。然后后面發(fā)現(xiàn)問題了。HTTP請(qǐng)求的話,有可能請(qǐng)求超時(shí),中斷失敗,IO異常其實(shí)都有可能,如果是平時(shí)打開一個(gè)網(wǎng)頁還好,打不開的時(shí)候,你會(huì)關(guān)掉,或者他頁面給你顯示信息。但是同步,不可以這樣做,一旦請(qǐng)求失敗,必須讓數(shù)據(jù)正確的同步,今天才意識(shí)到這個(gè)問題的重要性。
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ī)輸出,通過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();
}
代碼看上去寫的沒什么,該釋放資源的地方也釋放了。該打日志輸出的也打了。其實(shí)問題就是異常的處理。之前以為一些東西沒有同步過去是因?yàn)檫B接超時(shí)的問題。所以特地捕獲SocketTimeoutException異常,后面看了日志之后,發(fā)現(xiàn)是同步接口那邊服務(wù)器的問題,報(bào)了502錯(cuò)誤。其實(shí)異常是IO異常。
無論是那種情況,我們都要在出現(xiàn)這種問題之后,再次地把請(qǐng)求發(fā)送過去,根據(jù)接口返回的結(jié)果,確認(rèn)對(duì)方已經(jīng)同步到。如果服務(wù)器暫時(shí)性的出了問題,我們可以暫停一小段時(shí)間后,然后再次請(qǐng)求。
所以暫時(shí)想到的方法是,由于同步的實(shí)時(shí)性要求不高,那么可以間隔的時(shí)間可以長一點(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-02
IDEA2022中部署Tomcat Web項(xiàng)目的流程分析
這篇文章主要介紹了IDEA2022中部署Tomcat Web項(xiàng)目,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-03-03
Java 獲取指定日期的實(shí)現(xiàn)方法總結(jié)
以下是對(duì)Java中獲取指定日期的實(shí)現(xiàn)方法進(jìn)行了歸納總結(jié),需要的朋友可以參考下2013-07-07
SpringSecurity之SecurityContextHolder使用解讀
這篇文章主要介紹了SpringSecurity之SecurityContextHolder使用解讀,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-03-03
springboot實(shí)現(xiàn)rabbitmq的隊(duì)列初始化和綁定
這篇文章主要介紹了springboot實(shí)現(xiàn)rabbitmq的隊(duì)列初始化和綁定,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2018-10-10

