httpclient大量請求網絡拒絕 Connection pool shut down

1.背景描述

項目中每次400條數據遞歸網絡請求第三方數據,該次遞歸總的數據量有220000左右,可以算出大概需要550次調用。但是數據跑到13W左右,程序中斷。

2.案例分析

①.系統跑了一遍,沒有看到任何日誌。

分析: 因爲是多線程應用,一開始以爲是線程池寫法有誤,導致數據庫連接用完,

解決:使用自定義連接池上了一版,並且加上了日誌。

②.系統再跑了一遍,發現日誌報錯

 

 

分析:問題基本上可以定位到時httpclent問題了。

HttpClientBuilder builder = HttpClients.custom();

使用該方式定義了httpcliet,默認使用的是PoolingHttpClientConnectionManager 線程池管理器

默認每個route只允許最多2個connection,總的connection數量不超過20。

 

但是如果請求多了,還是會出現線程不夠用的情況。

解決:

第一種方案:

setConnectionManagerShared(true) 如果線程來不及處理,卡在那裏複用線程池。

第二種方案:

setMaxTotal(1000); // 連接池最大併發連接數

setDefaultMaxPerRoute(1000);// 設置最大併發數

③.系統又跑了一遍,發現棧溢出

 

 

分析:syncECCustomerByStepPage 方法棧溢出。

解決:

第一種方案:使用Xss設置棧的大小,弊端是需要知道棧有多大才好設置,而且開發環境和測試環境系統資源比較小,可能一下無法滿足需求。

第二種方案:重寫代碼,使用循環代替遞歸。

 

參考文檔:

https://blog.csdn.net/iq105/article/details/75355831

https://www.jianshu.com/p/14c005e9287c

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章