问题描述:
多线程使用httpclient调用接口时,一直保持响应,连接不断开。
增加了线程了,和超时的设置,但是仍然不能保证响应过长,断开连接。
把工具的设置贴上来
private static final CloseableHttpClient httpClient;
public static final String CHARSET_GBK = "GBK";
public static final String CHARSET_UTF8 = "UTF-8";
// 将最大连接数增加到
public static final int MAX_TOTAL = 600;
// 将每个路由基础的连接增加到
public static final int MAX_ROUTE_TOTAL = 300;
//设置超时时间
public static final int REQUEST_TIMEOUT = 2 * 1000;
public static final int REQUEST_SOCKET_TIME = 2 * 1000;
static {
// 设置连接超时 的时间
PoolingHttpClientConnectionManager httpClientConnectionManager = new PoolingHttpClientConnectionManager();
httpClientConnectionManager.setMaxTotal(MAX_TOTAL);
httpClientConnectionManager.setDefaultMaxPerRoute(MAX_ROUTE_TOTAL);
RequestConfig requestConfig = RequestConfig.custom()
.setConnectTimeout(REQUEST_TIMEOUT)
.setSocketTimeout(REQUEST_SOCKET_TIME).build();
// 设置重定向策略
LaxRedirectStrategy redirectStrategy = new LaxRedirectStrategy();
httpClient = HttpClients.custom()
.setConnectionManager(httpClientConnectionManager)
.setDefaultRequestConfig(requestConfig)
.setRedirectStrategy(redirectStrategy).build();
}
使用这个工具自己用了两个测试,一个是测试请求时间,一个测试的响应时间,都能正常的抛出错误。
测试1、请求了google的地址,报错:java.net.SocketTimeoutException: Read timed out
测试2、请求一个测试接口,接口中对请求休眠2000ms
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return "hello world";
运行结果:Caused by: java.net.SocketTimeoutException: connect timed out
但是把这个部署到服务器上后,使用对方的接口,如果对方处理的时间过长,连接就一直不会断开。导致处理速度一直被拖累。
请问这种情况能否解决?
SocketTimeout表示,服务器连接成功,但是未响应(未发送数据)时间超过SocketTimeout所设置的时间,
那么报错(SocketTimeoutException),如果在设置时间内响应了(开始传数据了),那么SocketTimeoutException不会产生。
当然,如果停止响应超过这个时间也会报错。
首先确认对方是否持续给客户端响应,如果是连接不会断开。
对于如何控制持续读取数据的超时,认为服务器那边应该可以设置。
客户端这边也可以做个监视线程,超过此时间,自己写代码控制打断。
有无其他方法,不明。