#在线上tomcat中发现了线程挂起:
MaxtTotal是整个连接池的大小,默认20;
DefaultMaxPerRoute是对于单个网站来说最大的连接数,默认是2.
比如连接池默认20个连接,但是发送到a.com的连接最多默认是2个。
#验证DefaultMaxPerRoute 为了验证这个,写了一个简单的controller,在处理方法中sleep很长时间,然后写一个client,开5个线程发请求,通过jstack发现有2个处在读取socket的状态,3个处在获取连接状态,
后来通过设置DefaultMaxPerRoute为20,启动5个线程,发现5个都处在读取socket状态 PoolingHttpClientConnectionManager cm = new PoolingHttpClientConnectionManager();cm.setDefaultMaxPerRoute(20);
#验证SocketTimeout和ConnectTimeout RequestConfig requestConfig = RequestConfig.custom().setSocketTimeout(3000).setConnectTimeout(3000).build(); 设置socket和connection超时都是3秒,并且把DefaultMaxPerRoute改回默认值2,发现5个线程都没有被挂起,而是先后抛出了java.net.SocketTimeoutException。
#验证ConnectionRequestTimeout RequestConfig requestConfig = RequestConfig.custom().setConnectionRequestTimeout(3000).build(); 只设置了从连接池里获取连接的超时时间为3秒,启动5个线程,发现2个在等待socket返回结果,其余的3个抛出异常:org.apache.http.conn.ConnectionPoolTimeoutException: Timeout waiting for connection from pool