1. 程式人生 > 其它 >多執行緒下httpClient報錯 Connection pool shut down

多執行緒下httpClient報錯 Connection pool shut down

技術標籤:javajava

報錯資訊

1、報錯資訊:Connection pool shut down

java.lang.IllegalStateException: Connection pool shut down
        at org.apache.http.util.Asserts.check(Asserts.java:34)
        at org.apache.http.pool.AbstractConnPool.lease(AbstractConnPool.java:191)
        at org.apache.http.impl.conn.PoolingHttpClientConnectionManager.
requestConnection(PoolingHttpClientConnectionManager.java:251) at org.apache.http.impl.execchain.MainClientExec.execute(MainClientExec.java:175) at org.apache.http.impl.execchain.ProtocolExec.execute(ProtocolExec.java:184) at org.apache.http.impl.execchain.RetryExec.execute(RetryExec.
java:88) at org.apache.http.impl.execchain.RedirectExec.execute(RedirectExec.java:110) at org.apache.http.impl.client.InternalHttpClient.doExecute(InternalHttpClient.java:184) at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:82) at org.
apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:107) at com.youzidata.speech.util.HttpClientUtil.requestOCRForHttp(HttpClientUtil.java:54) at com.youzidata.speech.task.RowBackThread.run(RowBackThread.java:79) at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) at java.util.concurrent.FutureTask.run(FutureTask.java:266) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) at java.lang.Thread.run(Thread.java:745)

解決方法

HttpClients.custom().setConnectionManagerShared(true).setSSLSocketFactory(sslsf).build();

通過設定setConnectionManagerShared(true)解決了“Connection pool shut down”的問題

PoolingHttpClientConnectionManager pccm = newPoolingHttpClientConnectionManager();
           pccm.setMaxTotal(1000); // 連線池最大併發連線數
           pccm.setDefaultMaxPerRoute(1000);// 單路由最大併發數
           return HttpClients.custom().setConnectionManager(pccm).setConnectionManagerShared(true).setSSLSocketFactory(sslsf).build();

apache 官方的建議是,建立連線池,併為每一個介面URL分配一個執行緒,去執行,還給出了許多高併發訪問的編碼技巧

參考

原文:https://hc.apache.org/httpcomponents-client-ga/tutorial/html/connmgmt.html
參考網址:
1、http://www.mamicode.com/info-detail-2297359.html
2、https://blog.csdn.net/iq105/article/details/75355831
3、https://blog.csdn.net/ystyaoshengting/article/details/49098949?utm_medium=distribute.pc_relevant.none-task-blog-baidujs_title-3&spm=1001.2101.3001.4242
4、https://hc.apache.org/httpcomponents-client-ga/tutorial/html/connmgmt.html