背景:最新專案需求呼叫http介面,所以打算使用最新的httpclient客戶端寫乙個工具類,寫好了以後在實際應用過程中遇到了一些問題,因為資料量還算
大,每次處理大概要處理600-700次請求,平均算下來大概需要20分鐘,這個速度雖然是跑在定時任務中的,但是也是不能忍受的,所以有了這個部落格.
1.首先想到的解決辦法就是多執行緒發請求了,但是這個有坑,最後會在結果處說明.
2.**方面如下
executorservice executor = executors.newfixedthreadpool(5);futuretaskfuture;
for (transactionrecord record:list)
class ordertask implements callable
@override
public order call() throws exception
}
這是一段很簡單的多執行緒**,但是其中有乙個坑需要大家注意的,不要在上面的迴圈中直接呼叫future.get()方法,如果直接呼叫的話就直接變成阻塞的了,和單執行緒
就沒有區別了,可以自己寫乙個demo測試一下效率.
3.http方面的**,可以全部貼出來,如下
response = httpclient.execute(httppost); //建立鏈結得到返回結果
int statuscode = response.getstatusline().getstatuscode(); //返回的結果碼
resultentry.setmsg("請求正常");
resultentry.setstatus(statuscode);
resultentry.setdata(result);
response.close();
return resultentry;
} catch (exception e) ,錯誤資訊:{}", e.getmessage(), e);
throw new exception("http請求異常");
} finally catch (ioexception e) ,錯誤資訊:{}", e.getmessage(), e);}}
response = httpclient.execute(httpget); //建立鏈結得到返回結果
int statuscode = response.getstatusline().getstatuscode();
resultentry.setmsg("請求正常");
resultentry.setstatus(statuscode);
resultentry.setdata(result);
response.close();
return resultentry;
} catch (exception e) ,錯誤資訊:{}", e.getmessage(), e);
throw new exception("http請求異常");
} finally catch (ioexception e) ,錯誤資訊:{}", e.getmessage(), e);}}
}}
使用的http連線池,連線池的**很簡單就不貼上了,首先使用的時候一定要注意最後的釋放工作,必須把httpentry和respose都釋放掉,按照官方文件的說法,只有這樣才是真的釋放了鏈結的,也就是這個鏈結才可以被復用.
總結:需要特別注意的是,訪問別人的http介面的時候一定不要開太多的執行緒,免得把別人的介面搞掛了,想我就的到了教訓,我在訪問乙個http的介面的時候開了一百個執行緒,666次請求跑了3.7秒左右,是很快我也很開心,然後那邊資料庫受不了壓力了,導致報警最後直接開了白名單,尷尬了,所以使用這些的時候一定要考慮這些,開三五個就夠了,另外如果開太多執行緒的話tomcat伺服器有可能假死也,不要這麼幹!
執行緒池和連線池
執行緒池的原理 來看一下執行緒池究竟是怎麼一回事?其實執行緒池的原理很簡單,類似於作業系統中的緩衝區的概念,它的流程如下 先啟動若干數量的執行緒,並讓這些執行緒都處於睡眠狀態,當客戶端有乙個新請求時,就會喚醒執行緒池中的某乙個睡眠執行緒,讓它來處理客戶端的這個請求,當處理完這個請求後,執行緒又處於睡...
執行緒池和連線池的區別
一 執行緒池的原理 執行緒池,究竟是怎麼一回事?其實執行緒池的原理很簡單,類似於作業系統中的緩衝區的概念,它的流程如下 先啟動若干數量的執行緒,並讓這些執行緒都處於睡眠狀態,當客戶端有乙個新請求時,就會喚醒執行緒池中的某乙個睡眠執行緒,讓它來處理客戶端的這個請求,當處理完這個請求後,執行緒又處於睡眠...
執行緒池和連線池的區別
一 執行緒池的原理 執行緒池,究竟是怎麼一回事?其實執行緒池的原理很簡單,類似於作業系統中的緩衝區的概念,它的流程如下 先啟動若干數量的執行緒,並讓這些執行緒都處於睡眠狀態,當客戶端有乙個新請求時,就會喚醒執行緒池中的某乙個睡眠執行緒,讓它來處理客戶端的這個請求,當處理完這個請求後,執行緒又處於睡眠...