那天,寫好一個爬蟲 爬取某個網站的數據。 當時調用了公司不知道某個人寫的 一個方法
logger.info(joururl); doc= util.getDocument(joururl.toString()); //這里通過url 去得到 網頁
本地調試 通過以后 就放到服務器上跑了。
跑着跑着就卡住。 也不報錯。 也不停。
當時 以為是內存滿了。找了很多方法。 能不重復new的對象堅決不重復new 定義java虛擬機內存 等
還是卡住
后來點進這個方法看才發現問題
這個方法 是這樣的
public static Document getDocument(String Url) { try { return Jsoup.connect(Url).userAgent(USER_AGENT).timeout(TIMEOUT).get(); } catch (IOException e) { return null; } }
這里 有什么問題呢。 當網絡波動的時候,或者別的原因, 沒有拿到網頁。 此時。 他catch了。 可是 不拋異常。 那么 程序不會停下來, 不會報錯,線程會直接阻塞住。
這就是卡的原因。
所以 應該改進為
Connection.Response response = null; for(int i=1;i<=3;i++){ response = Jsoup.connect(Url).userAgent(USER_AGENT).timeout(TIMEOUT).execute(); int statusCode = response.statusCode(); if(statusCode!=200){ log.info("get page error to"+i+"connect"); } else{ return response.parse(); } }
即,當頁面異常的時候 再連一次。 重復3次,假如3次都不成功,那么 拋異常 return null
也就 是說。 這個 statusCode的判斷是很重要的。
記住這個小坑。拋異常是非常重要的呀。 讓我知道是哪個寫的,我~~~~~~~~~
