多线程使用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
但是把这个部署到服务器上后,使用对方的接口,如果对方处理的时间过长,连接就一直不会断开。导致处理速度一直被拖累。
请问这种情况能否解决?
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
这是个3.X的超时设置方法:
HttpClient client = new HttpClient();
client.setConnectionTimeout(30000);
client.setTimeout(30000);
HttpClient httpClient= new HttpClient();
httpClient.getHttpConnectionManager().getParams().setConnectionTimeout(5000);
4.X版本的超时设置(4.3后已过时)
HttpClient httpClient=new DefaultHttpClient();
httpClient.getParams().setParameter(CoreConnectionPNames.CONNECTION_TIMEOUT,2000);//连接时间
httpClient.getParams().setParameter(CoreConnectionPNames.SO_TIMEOUT,2000);//数据传输时间
4.3版本超时设置
CloseableHttpClient httpClient = HttpClients.createDefault();
tpGet httpGet=new HttpGet("http://www.baidu.com");//HTTP Get请求(POST雷同)
RequestConfig requestConfig = RequestConfig.custom().setSocketTimeout(2000).setConnectTimeout(2000).build();//设置请求和传输超时时间
httpGet.setConfig(requestConfig);
httpClient.execute(httpGet);//执行请求Http
BTW,4.3版本不设置超时的话,一旦服务器没有响应,等待时间N久(>24小时)。