基於執行緒池和連線池的Http請求

2022-08-01 09:00:09 字數 2961 閱讀 1999

背景:最新專案需求呼叫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伺服器有可能假死也,不要這麼幹!

執行緒池和連線池

執行緒池的原理 來看一下執行緒池究竟是怎麼一回事?其實執行緒池的原理很簡單,類似於作業系統中的緩衝區的概念,它的流程如下 先啟動若干數量的執行緒,並讓這些執行緒都處於睡眠狀態,當客戶端有乙個新請求時,就會喚醒執行緒池中的某乙個睡眠執行緒,讓它來處理客戶端的這個請求,當處理完這個請求後,執行緒又處於睡...

執行緒池和連線池的區別

一 執行緒池的原理 執行緒池,究竟是怎麼一回事?其實執行緒池的原理很簡單,類似於作業系統中的緩衝區的概念,它的流程如下 先啟動若干數量的執行緒,並讓這些執行緒都處於睡眠狀態,當客戶端有乙個新請求時,就會喚醒執行緒池中的某乙個睡眠執行緒,讓它來處理客戶端的這個請求,當處理完這個請求後,執行緒又處於睡眠...

執行緒池和連線池的區別

一 執行緒池的原理 執行緒池,究竟是怎麼一回事?其實執行緒池的原理很簡單,類似於作業系統中的緩衝區的概念,它的流程如下 先啟動若干數量的執行緒,並讓這些執行緒都處於睡眠狀態,當客戶端有乙個新請求時,就會喚醒執行緒池中的某乙個睡眠執行緒,讓它來處理客戶端的這個請求,當處理完這個請求後,執行緒又處於睡眠...